【问题标题】:Access knockout binding from child element从子元素访问淘汰赛绑定
【发布时间】:2014-05-31 13:34:33
【问题描述】:

假设我有这个:

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

我是否可以从自定义绑定中访问父容器的“启用”绑定?

== 澄清:==

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

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

类似这样的东西(sudo 代码):

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

【问题讨论】:

  • 您是想查看父元素是否已启用/禁用,还是您需要访问任何绑定值并且启用恰好是您在此处使用的示例?
  • 我正在寻找绑定的值,enable 只是在这个例子中使用。
  • 我猜你想要绑定的当前淘汰赛评估值而不是绑定中的表达式?
  • 澄清......如果你有“启用:vmObservableProperty”你想知道启用绑定到vmObservableProperty还是启用当前是真还是假?
  • 添加了更多信息,我怀疑这是不可能的(没有很多肮脏的黑客)

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


【解决方案1】:

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

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

注意在绑定定义中使用双引号 ("),如下所示 jsFiddle

遗憾的是,我找不到更优雅的方法。

KO 允许您使用 dataFor/contextFor 访问 dom 元素的视图模型,但我没有看到任何获取 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

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

【讨论】:

  • 这将告诉您每个绑定绑定到哪个表达式,但不会告诉您评估表达式的运行时值。我不确定这是否是他想要的。
  • @ChuckSchneider 我相信这就是重点:值是常数,而不是可观察的
  • 在回应我上面的评论时,他说这只是一个例子。所以我不确定情况是否如此。
  • 意味着添加...您也可以使用 $(element).parent().data("bind") 来获取数据绑定。
  • @ChuckSchneider 它确实有效,谢谢你的提示,我不知道。更新答案
【解决方案2】:

是的。 custom bindings initupdate 函数的 bindingContext 参数公开了对 $parent$parents$root 的访问权限。

【讨论】:

  • 这似乎让我可以访问关联的视图模型,而不是绑定值本身。在这种情况下,我想获得分配给“启用”的值“假”。我误解了如何使用 $parent 吗?
  • 哦,我明白了。抱歉——我误会了。我不知道这样的东西是否存在。您能否用更多您要解决的具体示例来更新问题?可能有一种“淘汰方式”。
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 2013-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-04
相关资源
最近更新 更多