有没有一个等价的'作为'用于knockout.js中的

Is there an equivalant of 'as' for with in knockout.js?

本文关键字:用于 knockout js 中的 作为 有一个      更新时间:2024-04-18

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

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

与有一个等价词吗?类似于:with: { data: item, as: 'category' }

或者有更好的方法吗?

我想阻止的:

  • 采用与$parent.$parent等相关的方法
  • 将其放入视图模型

没有,没有。您可以看到as是如何在foreach绑定的源代码中实现的,并将其与没有类似内容的with绑定的源进行比较

你还没有对你的场景进行全面的再现,所以很难提出$parent.$parent的务实、具体的替代方案。您已经提到自己(不想使用)的主要方法是在视图模型中执行此操作。我认为,在大多数情况下,这是事实上的首选方式:类/视图模型/构造函数之间的关系最好在JavaScript代码本身中编码。一点也不,因为这将使它可以进行单元测试。

你唯一的选择是从$root开始,一路往下走。例如,假设这个嵌套:

var vm = { planet: { name: 'earth', country: { name: 'UK', city: { name: 'London' } } } };

然后,在最深的嵌套中,您有两种选择:

  • $parent.$parent.name
  • $root.planet.name

但再次强调:如果没有真正的谴责,很难提出真正的替代方案。

正如Jeroen所说,with绑定没有as选项。但是您可以使用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 };
    }
};