2016-07-11 20 views
0

everyone。我正在閱讀Knockout js doc here,這涉及到控制後代綁定。該場景是我使用applyBindingsToDescendants將後代元素與當前綁定上下文進行綁定,然後嘗試使用$ data.property_name訪問該後代元素的綁定上下文中的屬性,它僅在property_name已經在原始binding_context,如果它稍後添加,那麼$ data.property_name將不起作用,但如果我刪除$ data,它將起作用,請查看此jsfiddle example。誰能告訴我爲什麼它的行爲?

HTML

<div data-bind="addBindingProperties: {addedProp: 'ADDED PROPERTY'}"> 
    <div>Existing property accessible via $data: <span data-bind="text: $data.existingProp"></span></div> 
    <div>Added property not accessible via $data: <span data-bind="text: $data.addedProp"></span></div> 
    <div>Added property accessible by removing $data: <span data-bind="text: addedProp"></span></div> 
</div> 

的JavaScript

ko.bindingHandlers.addBindingProperties = { 
    init: function(element, valueAccessor, allBindings, viewModel, bindingContext) { 
     ko.utils.extend(bindingContext, valueAccessor()); 
     ko.applyBindingsToDescendants(bindingContext, element); 
     return {controlsDescendantBindings: true}; 
    } 
}; 

ko.applyBindings({ 
    existingProp: 'EXISTING PROPERTY' 
}); 

結果

Existing property accessible via $data: EXISTING PROPERTY 
Added property not accessible via $data: 
Added property accessible by removing $data: ADDED PROPERTY 

回答

1

$data在這裏意味着你的根視圖模型,所以這部分是錯誤的ko.utils.extend(bindingContext, valueAccessor());因爲你只是在實際上延長它到目前的情況下,這不是一個貼合到$data

你可以爲了它延伸到根上下文的財產$data存在,如:

ko.utils.extend(bindingContext, valueAccessor()); 
ko.utils.extend(bindingContext.$root, valueAccessor());