从子元素访问knockout绑定

时间:2014-04-16 15:14:56

标签: data-binding knockout.js knockout-3.0

让我说我有这个:

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

我可以访问&#39;启用&#39;从自定义绑定中绑定父容器?

==澄清:==

在自定义绑定中,您可以使用valueAssessor访问当前绑定值。您还可以通过bindingContext通过allBindings甚至不同相关上下文中的值访问其他绑定。

我只是想知道你是否可以从自定义绑定中访问父html元素的绑定(与valueAccessor类似)

像这样(sudo代码):

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

2 个答案:

答案 0 :(得分:8)

您可以访问父节点并解析其data-bind属性:

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

小心将双引号(&#34;)放入绑定定义中,如下所示 jsFiddle

可悲的是,我无法找到更优雅的方式来做到这一点。

KO允许您使用dataFor / contextFor访问dom元素的viewmodel,但我没有看到任何方法来获取dom元素的绑定定义。

修改 进一步调查后,您可以通过以下方式访问父母绑定:

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

它将返回带有绑定的对象。例如,如果您声明data-bind="style: { backgroundColor: myBackgroundColor }",则可以通过ko.bindingProvider.instance.getBindings($(element).parent().get(0), bindingContext).style.backgroundColor

访问observable

唯一的问题是你无法在viewmodel中获得可观察的名称(或者至少我不知道如何,除非你将每个属性与你的视图模型比较idiom for comparing knockout observables

答案 1 :(得分:0)

是。 custom bindings bindingContextinit函数的update参数会显示对$parent$parents$root的访问权限。