Knockout.js 具有childBindingContext-$data===$parent的KnockoutJS bindinghandler

Knockout.js 具有childBindingContext-$data===$parent的KnockoutJS bindinghandler,knockout.js,knockout-2.0,Knockout.js,Knockout 2.0,我目前正在编写一个自定义绑定处理程序,以便在我们的页面中形成一个控件。 此控件将生成自己的viewmodel,并作为主viewmodel的子对象,以便不更改原始viewmodel。(控制措施的实施与本页无关) 代码示例 我创建了一个抽象示例: JS: ko.bindingHandlers.subBinding={ init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){ var actualVal

我目前正在编写一个自定义绑定处理程序,以便在我们的页面中形成一个控件。
此控件将生成自己的viewmodel,并作为主viewmodel的子对象,以便不更改原始viewmodel。(控制措施的实施与本页无关)

代码示例
我创建了一个抽象示例:

JS:

ko.bindingHandlers.subBinding={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var actualValue=valueAccessor();
空节点(元素);
var subViewModel={};
subViewModel.subValue=
新的可观测ko.utils.Unwrapobbservable(实际值)*2;
var childBindingContext=bindingContext.createChildContext(viewModel);
extend(childBindingContext,subViewModel);
var getDomNodesFromHtml=函数(html){
var div=document.createElement('div');
div.innerHTML=html;
var元素=div.childNodes;
var-arr=[];
对于(var i=0;i
HTML:

<div id="main">
    <p>Main viewmodel:</p>
    <pre data-bind="text: JSON.stringify(ko.toJS($data), null, 4)"></pre>

   <hr />

   <!-- ko subBinding: value2 -->
   <!-- /ko -->
</div>

主视图模型:


问题
bindinghandlers的viewmodel上可用的$data实际上是父(主)viewmodel。这似乎是一种奇怪的行为,因为子值等其他属性实际上是正确绑定的。主视图模型上不存在这些属性

猜测
我的猜测是ControlsDescentBindings仅在绑定发生后返回。因此,主视图模型会渗透进来。KO则倾向于显示在mainviewmodel上下文中的$data

问题
(考虑到我的猜测是正确的)
有没有合适的方法来创建子viewmodel并将其绑定到BindingHandler自己的控件(在本例中为虚拟控件)上?

唉,主要的疏忽

我的实现基于以下文档页面:

更新的代码可在以下位置找到:

更改:

var childBindingContext = bindingContext.createChildContext(viewModel);
ko.utils.extend(childBindingContext, subViewModel);
变成

var childBindingContext = bindingContext.createChildContext(subViewModel);
我误解了createChildContext接受的参数-此参数是子上下文上的viewModel

--

控件的HTML片段变为:

var html = '<p data-bind="text: subValue"></p>' +
        'data: <pre data-bind="text: JSON.stringify(ko.toJS($data), null, 4)"></pre>' + 
        'parent: <pre data-bind="text: JSON.stringify(ko.toJS($parent), null, 4)"></pre>' +
        'root through parentcontext: <pre data-bind="text: JSON.stringify(ko.toJS($parentContext.$root), null, 4)"></pre>' +
        'root (not working): <pre data-bind="text: JSON.stringify(ko.toJS($root), null, 4)></pre>';
var html='

'+ “数据:”+ '家长:'+ '通过parentcontext进行根目录:'+
“根(不工作):四年后,这刚刚引起了一个闪电般的瞬间,解决了我的问题,谢谢:)想知道有多少人被那个文档抛了出去?
var html = '<p data-bind="text: subValue"></p>' +
        'data: <pre data-bind="text: JSON.stringify(ko.toJS($data), null, 4)"></pre>' + 
        'parent: <pre data-bind="text: JSON.stringify(ko.toJS($parent), null, 4)"></pre>' +
        'root through parentcontext: <pre data-bind="text: JSON.stringify(ko.toJS($parentContext.$root), null, 4)"></pre>' +
        'root (not working): <pre data-bind="text: JSON.stringify(ko.toJS($root), null, 4)></pre>';