这比听起来简单得多。
假设我有一个自定义绑定(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 - 如果在 custom
或 if
或 之前存在嵌套的
(你得到了图片)。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/