Access knockout binding from child element

做~自己de王妃 提交于 2019-12-10 18:08:22

问题


Lets say i have this:

<div data-bind="enable: false">
    <div data-bind="someCustomBinding: myValue"></div>
</div>

Is is possible for me to access the 'enable' binding of the parent container from within the custom binding?

== Clarification: ==

In a custom binding you can gain access to the current binding value with the valueAssessor. you can also gain access to other bindings through allBindings and even values on different related contexts via the bindingContext.

I was just wondering if you could access the binding of a parent html element from within a custom binding (in a similar way to the valueAccessor)

Something like this (sudo code):

ko.bindingHandlers.someCustomBinding=
{
    init: (element, valueAccessor, allBindings) =>
    {
        var parentIsEnabled = 
             ko.GetContextFor($(element).parent()).get('enable');
    }
}

回答1:


You could access the parent node and parse its data-bind attribute:

JSON.parse('{' + $(element).parent().data("bind") + '}')

Be careful to put double quote (") in your binding definition, as in the following jsFiddle

Sadly I can't find a more elegant way to do it.

KO lets you access the viewmodel of a dom element using dataFor/contextFor, but I don't see any method to get the binding definition of a dom element.

EDIT: After further investigation, you can access the parents binding with the following:

ko.bindingProvider.instance.getBindings($(element).parent().get(0), bindingContext)

It will return an object with the bindings. For example if you declare a data-bind="style: { backgroundColor: myBackgroundColor }" you will be able to access the observable through ko.bindingProvider.instance.getBindings($(element).parent().get(0), bindingContext).style.backgroundColor

The only problem is that you can not get the observable name within the viewmodel (or at least I don't know how, except if you compare each property with your viewmodel like idiom for comparing knockout observables)




回答2:


Yes. The bindingContext parameter of the custom bindings init and update functions exposes access to $parent, $parents and $root.



来源:https://stackoverflow.com/questions/23113503/access-knockout-binding-from-child-element

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!