2013-10-03 3 views
1

로컬 JSON 데이터에서 observableArray를 성공적으로 만들고 UI에 눈금을 만듭니다. 이러한 항목을 편집하고 새 항목을 추가 (밀어 넣기) 할 수도 있습니다. observableArray에서 새 항목을 볼 수 있으므로이 항목이 있음을 알 수 있습니다. 내가 가지고있는 문제는 배열에있는 항목을 편집 할 수 없다는 것입니다. 여기 녹아웃 : UI에 추가 된 항목을 편집 할 수 없습니다.

내 JS입니다 :

$(function() { 
    var dataFromServer = ko.utils.parseJson(JSONdataFromServer); 
    var shortUserArray = dataFromServer; 
    shortUserArray.length = 5; 

    console.log(shortUserArray); 

    function Item(firstName, lastName, title) { 
     this.firstName = ko.observable(firstName, { persist: firstName }); 
     this.lastName = ko.observable(lastName, { persist: lastName }); 
     this.title = ko.observable(title, { persist: title }); 
    } 

    //do some basic mapping (without mapping plugin) 
    var mappedData = ko.utils.arrayMap(shortUserArray, function (item) { 
     return new Item(item.firstName, item.lastName, item.title); 
    }); 

    var viewModel = function() { 
     var self = this; 

     // data 
     self.people = ko.observableArray(mappedData, { persist: 'people' }), 
     self.firstNameToAdd = ko.observable(""), 
     self.lastNameToAdd = ko.observable(""), 
     self.titleToAdd = ko.observable(""), 
     self.selectedPerson = ko.observable(null), 
     self.addPerson = function() { 
      this.people.push({ 
       firstName: this.firstNameToAdd(), 
       lastName: this.lastNameToAdd(), 
       title: this.titleToAdd() 
      }); 
      this.firstNameToAdd(""); 
      this.lastNameToAdd(""); 
      this.titleToAdd(""); 
     }, 
     self.selectPerson = function() { 
      viewModel.selectedPerson(this); 
     }, 
     self.addOnEnter = function() { 
      var keyCode = (event.which ? event.which : event.keyCode); 
      if (keyCode === 13) { 
       viewModel.addPerson(); 
      } 
      return true; 
     }; 


     $(document).on("click", ".row-delete", function() { 
      var itemToRemove = ko.dataFor(this); 
      self.people.remove(itemToRemove); 
     }); 
    }; 

    ko.applyBindings(new viewModel()); 


}); 

// Custom binding to add an item to the list when the user presses enter 
ko.bindingHandlers.executeOnEnter = { 
    init: function (element, valueAccessor, allBindingsAccessor, viewModel) { 
     var value; 
     value = void 0; 
     value = valueAccessor(); 
     return $(element).keypress(function (event) { 
      var keyCode; 
      keyCode = void 0; 
      keyCode = (event.which ? event.which : event.keyCode); 
      if (keyCode === 13) { 
       value.call(viewModel); 
       return false; 
      } 
      return true; 
     }); 
    } 
}; 

... 그리고 여기에 HTML입니다 : 현재

<div class="container"> 
    <div class="row"> 
     <div class="col-md-12"> 
     <a data-toggle="modal" href="#addUser" class="btn btn-primary"><span class="glyphicon glyphicon-plus"></span> Add New User</a> 
      <button type="button" class="btn btn-default pull-right" onclick="localStorage.clear();"><span class="glyphicon glyphicon-refresh"></span> Clear Local Storage</button> 
      <hr /> 
      <div class="table-responsive"> 
       <table class="table table-bordered table-striped table-hover"> 
        <thead> 
         <tr> 
          <th>First Name</th> 
          <th>Last Name</th> 
          <th>Title</th> 
          <th></th> 
          <th></th> 
         </tr> 
        </thead> 
        <tbody data-bind="foreach: people"> 
         <tr> 
          <td data-bind="text: firstName"></td> 
          <td data-bind="text: lastName"></td> 
          <td data-bind="text: title"></td> 
        <td data-bind="click: $root.selectedPerson"> 
         <a href="#editUser" role="button" data-toggle="modal"><span class="glyphicon glyphicon-edit"></span> Edit User</a> 
        </td> 
        <td data-bind="click: $root.selectedPerson"> 
         <a href="#" class="row-delete"><span class="glyphicon glyphicon-remove"></span> Delete User</a> 
        </td> 
         </tr> 
        </tbody> 
       </table> 
      </div> 
     </div> 
    </div> 
</div> 

<!-- Add User Modal --> 
<div class="modal fade" id="addUser" tabindex="-1" role="dialog" aria-labelledby="addUserLabel" aria-hidden="true"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
       <h4 class="modal-title">Add User</h4> 
      </div> 
      <div class="modal-body"> 
      <div class="form-group"> 
       <label for="first-name">First Name</label> 
       <input type="text" class="form-control" id="first-name" data-bind="value: firstNameToAdd, valueUpdate: 'afterkeydown'"> 
      </div> 
      <div class="form-group"> 
       <label for="last-name">Last Name</label> 
       <input type="text" class="form-control" id="last-name" data-bind="value: lastNameToAdd, valueUpdate: 'afterkeydown'"> 
      </div> 
      <div class="form-group"> 
       <label for="job-title">Job Title</label> 
       <input type="text" class="form-control" id="job-title" data-bind="value: titleToAdd, valueUpdate: 'afterkeydown'"> 
      </div> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       <button type="submit" class="btn btn-primary" data-bind="click: addPerson, enable: firstNameToAdd().length > 0 && lastNameToAdd().length > 0 && titleToAdd().length > 0" data-dismiss="modal">Add User</button> 
      </div> 
     </div><!-- /.modal-content --> 
    </div><!-- /.modal-dialog --> 
</div><!-- /.modal --> 

<!-- Edit User Modal --> 
<div class="modal fade" id="editUser" tabindex="-1" role="dialog" aria-labelledby="editUserLabel" aria-hidden="true" data-bind="with: selectedPerson"> 
    <div class="modal-dialog"> 
     <div class="modal-content"> 
      <div class="modal-header"> 
       <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button> 
       <h4 id="editUserLabel" data-bind="text: firstName" class="modal-title">Edit User</h4> 
      </div> 
      <div class="modal-body"> 
      <div class="form-group"> 
       <label for="edit-first-name">First Name</label> 
       <input type="text" class="form-control" id="edit-first-name" data-bind="value: firstName" id="edit-first-name"> 
      </div> 
      <div class="form-group"> 
       <label for="edit-last-name">Last Name</label> 
       <input type="text" class="form-control" id="edit-last-name" data-bind="value: lastName" id="edit-last-name"> 
      </div> 
      <div class="form-group"> 
       <label for="edit-job-title">Job Title</label> 
       <input type="text" class="form-control" id="edit-job-title" data-bind="value: title" id="edit-job-title"> 
      </div> 
      </div> 
      <div class="modal-footer"> 
       <button type="button" class="btn btn-default" data-dismiss="modal">Close</button> 
       <button type="button" class="btn btn-primary" data-dismiss="modal">Save changes</button> 
      </div> 
     </div><!-- /.modal-content --> 
    </div><!-- /.modal-dialog --> 
</div><!-- /.modal --> 

<pre data-bind="text: ko.toJSON($data, null, 2)"></pre> 
+0

추가 바이올린 : http://jsfiddle.net/gravyfries/sskMG/ – gravyfries

답변

2

새 사람의 이름을 제공하는 경우, 당신은 단지에 전달하는 관찰 this.firstNameToAdd()의 값하지만 firstName 특성 자체 관측을 ..

을하지 당신은 ... 중 하나를해야

,536
this.people.push({ 
    firstName: ko.observable(this.firstNameToAdd()), 
    lastName: ko.observable(this.lastNameToAdd()), 
    title: ko.observable(this.titleToAdd()) 
}); 

또는 더 나은- 이미 Item 클래스가 있기 때문에 ..

this.people.push(new Item(
    this.firstNameToAdd(), 
    this.lastNameToAdd(), 
    this.titleToAdd() 
)); 

바이올린 : http://jsfiddle.net/sskMG/1/

+0

그래서 이제는 내가 그것을 볼 명백한 - 아직도 KO 주위에 내 머리를 얻으려고. 감사! – gravyfries

관련 문제