2016-07-11 3 views
0

皆さん。私は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は、あなたのルートのviewmodelを意味するので、あなただけ実際にそれを拡張しているので、この部分はko.utils.extend(bindingContext, valueAccessor());間違っていますしたがって、現在のコンテキストには、 $dataにttachedします。

ko.utils.extend(bindingContext, valueAccessor()); 
ko.utils.extend(bindingContext.$root, valueAccessor()); 
:あなたが好きな $data内に存在するプロパティのために、ルートコンテキストにそれを拡張することができ

関連する問題