Javascript js在不同的上下文中注册多个组件

Javascript js在不同的上下文中注册多个组件,javascript,knockout.js,Javascript,Knockout.js,我正在尝试使用knockoutjs注册多个组件,但来自同一应用程序中的不同上下文,这会导致“错误:您不能对同一元素多次应用绑定。” 我试着从多个地方调用它 knockout.components.register('a-name', { viewModel: AViewModel, template: { require: 'text!ui/views/a-view.html' } }); knockout.applyBindings(); 如果我在一个地方注册所有组件并生成

我正在尝试使用knockoutjs注册多个组件,但来自同一应用程序中的不同上下文,这会导致“错误:您不能对同一元素多次应用绑定。”

我试着从多个地方调用它

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

knockout.applyBindings();
如果我在一个地方注册所有组件并生成applyBindings()一次,那么这就行了。但另一方面,这给我带来了许多其他问题。因为我希望我注册的每个组件彼此独立

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

编辑:找到此答案:


声明每个DOM元素只能调用一次ko.applyBindings()。我不明白这一点,而且他们的文档非常少。在使用knockout时,是否有其他方法在需要时注入html?

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

伪代码

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类: 注册表名()

x类:注册表名()

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

不,恐怕你不能。在调用
applyBindings
之前已完成注册

这并不直接意味着组件必须相互依赖。您需要整个应用程序的合成根目录(或者每个
applyBindings
call/appdom区域至少一个),并在那里注册所有组件。组件本身不需要相互了解,不用说


请注意,这只是关于注册组件。您仍然可以按需使用实际组件。

这是伪代码检查是否存在类似contains方法的内容实际上检查组件是否已注册的方法如下:if(knockout.components.isRegistered('a-name'))return;