2012-05-15 78 views
1

傳遞函數我有一個observableArrayknockoutjs:自定義數據綁定「與」參照

this.Itens = ko.obeservableArray(); 
this.Itens.toString = function() {return 'my items array'}; 

我需要參考的所有子標籤通過了「物品」屬性,因爲我要訪問附着兒童做起,從一個jQuery插件啓動方式:

<div data-bind="customWith: Items "> 
    <ul data-bind="foreach:$data"> <!-- function reference of items --> 
     <li data-bind="text: ko.toJSON($data)"></li> 
    </ul> 

    <br> 
    <br> 

    <!-- Only for debugging --> 
    <p data-bind="text: ko.toJSON($data)"></p> 
    <p data-bind="text: ko.toJSON($data()[0])"></p> 
    <p data-bind="text: $data.fnTest"></p> 
    <p data-bind="text: $data.fnTest()"></p> 
</div> 

這裏是習俗ko.bindingHandler:

ko.bindingHandlers.customWith = { 

    init: function (element, valueAccessor, allBindingsAcessor, viewModel, bindingContext) { 
     ko.bindingHandlers.customWith.update.apply (this, arguments); 
     $(element).myplugin(); 
     return {'controlsDescendantBindings': true}; 
    }, 
    update: function (element, valueAccessor, allBindingsAcessor, viewModel, bindingContext) { 
     var fnReference valueAccessor =(); 
     var childBindingContext = bindingContext.createChildContext (fnReference); 
     ko.applyBindingsToDescendants (childBindingContext, element); 
    } 
}; 

完整的代碼是在這裏:http://jsfiddle.net/AbraaoAlves/fz5Yj/

正如你可以在div標籤customWith內看到,p正確地呈現內容 並更新添加或從列表中, 但UL標記刪除項目(的foreach :$ data)不會呈現任何東西甚至valueAccessor處理程序與foreach 所有正確的數據。

在這種情況下,我可以做什麼來呈現列表中的項目?

+0

你真的不清楚你想達到什麼,這裏的目標是什麼?順便說一句,是不是你的調用customWith.update多餘,因爲更新將在init後立即調用。 – madcapnmckay

+0

刪除那個調用來在init裏面更新會導致它開始工作。 –

回答

1

您需要將子綁定設置移動到您的自定義綁定處理程序的init方法。您的處理程序應該看起來像這樣,不需要更新方法:

ko.bindingHandlers.customWith = { 

    init:function(element, valueAccessor, allBindingsAcessor, viewModel, bindingContext){ 

     var fnReference = valueAccessor();   
     var childBindingContext = bindingContext.createChildContext(fnReference); 
     ko.applyBindingsToDescendants(childBindingContext, element); 

     $(element).myplugin(); 

     return {'controlsDescendantBindings':true};   
    }, 
}; 

這將導致您的LI正確呈現。