在knockout.js foreach
中,您可以使用as
参数将值作为别名保存到上下文中,这样您就可以在绑定中更深处使用它。请参阅documentation。
<ul data-bind="foreach: { data: items, as: 'category' }">
</ul>
是否存在等价物?类似于:with: { data: item, as: 'category' }
?
或者有更好的方法吗?
我想阻止的是:
$parent.$parent
等的相对方式答案 0 :(得分:1)
不,没有。您可以在foreach
binding's source code中看到as
的实施方式,并将其与没有任何类型的source of the with
binding进行比较。
你还没有完全重现你的场景,所以很难建议$parent.$parent
的实用,具体的替代方案。您自己已经提到的主要内容(因为不想使用),这是在View Models中执行此操作。我将争辩说,在大多数情况下, 实际上是做事的首选方式:类/视图模型/构造函数之间的关系最好用JavaScript代码本身编码。至少是因为这会使它可以单元测试。
唯一的替代方案是从$root
开始,然后继续努力。例如,假设这种嵌套:
var vm = { planet: { name: 'earth', country: { name: 'UK', city: { name: 'London' } } } };
然后在最深的筑巢处,您有两种选择:
$parent.$parent.name
$root.planet.name
但同样:如果没有真正的复制品,很难提出实际的替代方案。
答案 1 :(得分:1)
正如Jeroen所说,as
绑定不是with
选项。但您可以使用foreach
绑定绑定单个项目:
foreach: { data: item, as: 'category' }
如果您知道item
永远不会为null,您可以使用这个简单的自定义绑定来执行您想要的操作:
ko.bindingHandlers.with2 = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
var innerContext = bindingContext.createChildContext(
function () { return valueAccessor()['data']; },
valueAccessor()['as']);
ko.applyBindingsToDescendants(innerContext, element);
return { controlsDescendantBindings: true };
}
};