2012-10-28 26 views
2

有没有一种方法来绑定自定义绑定内的元素?例如,我有自定义绑定,并将绑定到其项目的可观察到的数组:我可以动态绑定自定义绑定内的元素吗?

var someArrayOfItems = ko.observableArray(['item1', 'item2', 'item3']); 
... 
<div data-bind="myBinding: someArrayOfItems"></div> 

现在我想myBinding列出div元素它一定会喜欢里面全部来自“someArrayOfItems”的元素:

<ul data-bind="foreach: someArrayOfItems"> 
    <li> 
     <span data-bind="text: $data"></span> 
    </li> 
</ul> 

是否可以使用自定义绑定进行此类操作? 感谢您的帮助。

回答

10

您可以使用函数ko.applyBindingsToNode动态添加绑定到元素。

就你而言,你还需要用适当的“模板”填充内容。

例如,你可以这样做:

ko.bindingHandlers.myBinding = { 
    init: function(element, valueAccessor) { 
     var ul = document.createElement("ul"), 
      data = valueAccessor(); 

     //append a new ul to our element 
     element.appendChild(ul); 

     //could use jQuery or DOM APIs to build the "template" 
     ul.innerHTML = "<li><span data-bind='text: $data'></span></li>"; 

     //apply foreach binding to the newly created ul with the data that we passed to the binding 
     ko.applyBindingsToNode(ul, { foreach: data });; 

     //tell Knockout that we have already handled binding the children of this element 
     return { controlsDescendantBindings: true }; 
    }   
}; 

样品在这里:http://jsfiddle.net/rniemeyer/z458E/

+0

谢谢,这是非常有帮助的。我对这个解决方案有一个问题。如果我想要使用输入元素而不是span元素来编辑列表中的每个项目,该怎么办?这是否也有可能?我试着简单地将跨度改为输入,但它不适合我。 – Eori

+0

您需要在数据结构中为其指定属性名称。像这样:http://jsfiddle.net/rniemeyer/z458E/2/ –

+0

工程太棒了!谢谢。 – Eori