javascript - 从当前绑定(bind)上下文中检索父属性名称/路径

标签 javascript knockout.js

这比听起来简单得多。

假设我有一个自定义绑定(bind):

KO.bindingHandlers.custom = {
  init:function(element, valueAccessor, allBindingsAccessor, 
                context, bindingContext) {
    ...
  }
});

通过 HTML 标记应用,如下所示:

<div>
  <div data-bind="with: a">
    <span data-bind="custom: aa"></span>
  </div>
  <div data-bind="with: b">
    <span data-bind="custom: bb"></span>
  </div>
</div>

其中 ViewModel 结构是:

{
  root: {
    a: {
      aa: 100
    },
    b: {
      bb: 200
    }
  }
}

我想知道,在 init 函数中谁是“爸爸”,可以这么说,以便当 init 处理 custom 时: bb 绑定(bind) 我想知道属性路径是 root.b (或获取任何合适的指示)。

使用 bindingContext.$parent 显然没有帮助,因为它也包含 a

尝试

到目前为止,最接近的是使用 bindingContext.createChildContext 并在绑定(bind)中传递父属性的名称(如下面的第一个 自定义 绑定(bind)所示):

<div>
  <div data-bind="with: a">
    <span data-bind="custom: {name: 'aa', parent: 'a'}"></span>
  </div>
  <div data-bind="with: b">
    <span data-bind="custom: bb"></span>
  </div>
</div>

太丑了。

注意

请注意,嵌套级别可能超过 1 - 如果在 customif 之前存在嵌套的 with 绑定(bind)>foreach(你得到了图片)。

有什么想法吗?

谢谢。

最佳答案

我还没有真正测试过这一点,但是您可以从自定义绑定(bind)中调用这样的函数来遍历绑定(bind)上下文堆栈并使用 === 来找出父级中的哪个属性object 与当前上下文绑定(bind)的对象匹配。

var getPath = function (bindingContext) {
    var parts = [],
        prev = bindingContext,
        i, n;

    for (i = 0, n = bindingContext.$parents.length; i < n; ++i) {
        var p = bindingContext.$parents[i];
        // find which property of p.$data corresponds to prev.$data
        var properties = Object.keys(p.$data);
        var matchingProperty = ko.utils.arrayFirst(properties, function (name) {
            return ko.unwrap(p.$data[name]) === prev.$data;
        });

        parts.unshift(matchingProperty || "could not determine this part");
        prev = p;
    }

    return parts.join(".");
};

我认为它只适用于简单的 with 表达式。复合 with 表达式将击败该算法。

关于javascript - 从当前绑定(bind)上下文中检索父属性名称/路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21657797/

相关文章:

javascript - 使用 Quicksand 后,“单击”事件在 Backbone.View 中消失

javascript - 找到出现的字符串并用跨度将其包裹起来

javascript - clearRect 不工作

javascript - 从 textInput 字段自动更新 observablearray 当前行中的字段

javascript - 在knockout JS中绑定(bind)复杂模型

Javascript - 克隆原型(prototype)函数

javascript - 将图像移动到一组图像的右侧或左侧 onClick

Knockout.js 找不到 ID 错误的模板

jquery - 数据绑定(bind)单选按钮没有样式

javascript - if else 条件 knockout 数据绑定(bind)