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

时间:2016-03-15 09:22:48

标签: javascript knockout.js

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

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

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

knockout.applyBindings();

如果我在一个地方注册所有组件并使applyBindings()一次,这是有效的。但另一方面,这会给我带来许多其他问题。因为我希望我注册的每个组件彼此独立。

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

编辑:找到这个答案:Knockout: Error: You cannot apply bindings multiple times to the same element when refreshing page

其中声明ko.applyBindings()每个DOM元素只能调用一次。我不明白这一点,他们的文件非常渺茫。在使用淘汰赛时是否还有其他方法可以在需要时注入html?

2 个答案:

答案 0 :(得分:1)

  

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

不,AFAIK你不能。注册必须在致电applyBindings之前完成。

直接意味着组件必须依赖于彼此。您需要整个应用程序的组合根(或每个applyBindings调用/应用DOM区域至少一个)并在那里注册所有组件。组件本身不需要彼此了解,而不是说。

请注意,这只是关于注册组件。您仍然可以根据需要asynchronous loading获得实际组件。

答案 1 :(得分:0)

为什么不在商务逻辑中编写全局注册函数:

伪代码!

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类: registerAname()

class x:registerAname()