挖空.js在不同的上下文中注册多个组件

Knockout.js register multiple components in different contexts

本文关键字:注册 组件 上下文 js 挖空      更新时间:2023-09-26

我正在尝试使用 knockoutjs 注册多个组件,但来自同一应用程序的不同上下文,导致"错误:您无法多次将绑定应用于同一元素"。

我试图做的是从多个地方调用它。

knockout.components.register('a-name', {
    viewModel: AViewModel,
    template: { require: 'text!ui/views/a-view.html' }
});
knockout.applyBindings();

如果我在一个地方注册所有组件并制作一次 applyBindings(),这将起作用。但另一方面,这给我带来了多个其他问题。因为我希望我注册的每个组件都彼此独立。

那么我可以在应用程序的不同部分中注册组件吗?

编辑:找到这个答案:挖空:错误:刷新页面时无法多次将绑定应用于同一元素

其中指出 ko.applyBindings() 每个 DOM 元素只能调用一次。我不明白这一点,他们的文档非常少。在使用挖空时,有没有另一种方法可以在需要时注入 html?

我可以在应用的单独部分中注册组件吗?

不,你不能。在致电applyBindings之前已完成注册。

并不直接意味着组件必须相互依赖。您需要整个应用的组合根(或每个applyBindings调用/应用 DOM 区域至少一个),并在其中注册所有组件。组件本身不需要相互了解,不需要说。

请注意,这只是关于注册组件。您仍然可以按需异步加载实际组件。

为什么不在业务逻辑中编写一个全局寄存器函数:

伪代码!

function registerAname()
{
    if( knockout.components.contains('a-name'))
        return;
    knockout.components.register('a-name', {
       viewModel: AViewModel,
       template: { require: 'text!ui/views/a-view.html' }
    });
    knockout.applyBindings();
 }

C类:注册Aname()

类 x: 注册Aname()