2014-11-21 107 views
1

我在與創建上下文定製的淘汰賽結合處理問題的子元素。示例如下:http://jsfiddle.net/gf3tfarz/14/淘汰賽自定義綁定處理程序不更新

'容器'應用於可觀察數組時,它不更新子元素。

<div data-bind="container: { data: selectedCountry().ids }"> 
    <p>Error: <span data-bind="text: $container.data().length"></span></p> 
    <div data-bind="foreach: $container.data"> 
     <p>Error: <span data-bind="text: $data"></span></p> 
    </div> 
</div> 

這是自定義綁定處理程序:

ko.bindingHandlers.container = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) { 
     var innerBindingContext = bindingContext.extend({ 
      $container: ko.utils.unwrapObservable(valueAccessor()) 
     }); 

     ko.applyBindingsToDescendants(innerBindingContext, element); 

     return { controlsDescendantBindings: true }; 
    } 
}; 

我想,使用的示範工作「容器」目前這兩個例子中的一種方式。

注意使用「與」它的工作原理。

+3

對不起,_what_是錯的小提琴?我們在看什麼?我們如何知道它不起作用?你知道嗎?究竟發生了什麼?這似乎對我有用。 – 2014-11-21 19:29:47

+0

「選擇」更改後,「錯誤:」之後的所有文本都不會更新。這是錯誤。在我看來,它應該像「Ok:」之後的所有文本一樣改變,它使用不同的技術。 – 2014-11-22 02:05:06

+1

一個或多或少容易的解決辦法是把你的$容器放入一個計算:http://jsfiddle.net/wn5zp9qu/。然而,在這種情況下,你必須寫'$容器()'每一個地方,你要使用它:'數據綁定=「的foreach:$容器()數據」' – nemesv 2014-11-22 14:03:44

回答

0

你不應該直接擴展bindingContext,你應該創建一個子綁定上下文。那麼它將會如何工作。

ko.bindingHandlers.container = { 
    init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {  
     // Make a modified binding context, with a extra properties, and apply it to descendant elements 
     var innerBindingContext = bindingContext.createChildContext(
      bindingContext.$rawData, 
      null, // Optionally, pass a string here as an alias for the data item in descendant contexts 
      function(context) { 
       ko.utils.extend(context, { 
        $container: ko.utils.unwrapObservable(valueAccessor()) 
       }); 
      }); 

     ko.applyBindingsToDescendants(innerBindingContext, element); 

     return { controlsDescendantBindings: true }; 
    } 
}; 

請參見本頁面底部的詳細信息... http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html