2013-01-15 26 views
2

我有一个问题,在$ knockout的$父母。

,如果我有型号:

 var Person = function() { 

     var self = this; 

     self.person_Id = ko.observable(); 
     self.firstName = ko.observable(); 
     self.lastName = ko.observable(); 
     self.age = ko.observable(); 
     self.role = ko.observable(); 

     self.init = function (data) { 

      self.person_Id(data.person_Id); 
      self.firstName(data.firstName); 
      self.lastName(data.lastName); 
      self.age(data.age); 
      self.role(data.role); 
     }; 

    }; 

和收集

 var PersonCollection = function() { 

     var self = this; 

     self.ItemToEditOrToAdd = ko.observable(new Person()); 

     self.persons = ko.observableArray(); 

     self.AddItem = function (item) { 

      self.persons.push(item); 


     }; 

    }; 

和HTML

   <div id="new" data-bind="with: PersonCollectionInstance.ItemToEditOrToAdd"> 

       <p>Firstname: <input type="text" data-bind="value: firstName"/></p> 
       <p>Lastname: <input type="text" data-bind="value: lastName"/></p> 
       <p>Age: <input type="text" data-bind="value: age"/></p> 
       <p>Role: <input type="text" data-bind="value: role"/></p> 
       <button data-bind="click: $parent.PersonCollectionInstance.AddItem">Add new</button> 

      </div> 

如果你看一下HTML,访问的AddItem自然的方式是写

<button data-bind="click: $parent.AddItem">Add new</button> 

这不起作用,因为$父绑定让我到我的AppVM,这是我所有强大的视图模型,而不是回到我的PersonCollectionInstance。

这就是为什么我需要做的是这样的:

<button data-bind="click: $parent.PersonCollectionInstance.AddItem">Add new</button> 

为什么$父母让我回到我的所有强大的视图模型,而不是在那里我的AddItem是PersonCollectionInstance的任何人都可以向我解释?

回答

4

你需要写data-bind="click: $parent.PersonCollectionInstance.AddItem"因为您已经定义了with这样的:

data-bind="with: PersonCollectionInstance.ItemToEditOrToAdd"` 

所以,你必须在你的with结合,因为你已经进入一个嵌套属性下台两个层次。然而,$parent仍然指向您的主视图模型,因为淘汰赛不能跟踪您的嵌套属性,并且它不会为您创建嵌套的上下文。

所以可以使用两个with达到期望的结果:

<div id="new" data-bind="with: PersonCollectionInstance"> 
    <!-- ko with: ItemToEditOrToAdd --> 
    <p>Firstname: <input type="text" data-bind="value: firstName"/></p> 
    <p>Lastname: <input type="text" data-bind="value: lastName"/></p> 
    <p>Age: <input type="text" data-bind="value: age"/></p> 
    <p>Role: <input type="text" data-bind="value: role"/></p> 
    <button data-bind="click: $parent.AddItem">Add new</button> 
    <!-- /ko --> 
</div> 

如果你无论如何使用两个with你可以把你的按钮“外”:

<div id="new" data-bind="with: PersonCollectionInstance"> 
    <!-- ko with: ItemToEditOrToAdd --> 
    <p>Firstname: <input type="text" data-bind="value: firstName"/></p> 
    <p>Lastname: <input type="text" data-bind="value: lastName"/></p> 
    <p>Age: <input type="text" data-bind="value: age"/></p> 
    <p>Role: <input type="text" data-bind="value: role"/></p>  
    <!-- /ko --> 
    <button data-bind="click: AddItem">Add new</button> 
</div>