2012-10-28 75 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

相關問題