在knockout.js中是否有相同的'as'?

时间:2015-02-24 16:33:42

标签: javascript knockout.js

在knockout.js foreach中,您可以使用as参数将值作为别名保存到上下文中,这样您就可以在绑定中更深处使用它。请参阅documentation

<ul data-bind="foreach: { data: items, as: 'category' }">
</ul>

是否存在等价物?类似于:with: { data: item, as: 'category' }

或者有更好的方法吗?

我想阻止的是:

  • 使用$parent.$parent等的相对方式
  • 将其置于视图模型中

2 个答案:

答案 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 };
    }
};