为什么组件在params中处理会发生变化?

时间:2015-09-06 20:54:59

标签: javascript knockout.js knockout-components knockout-3.2

根据组件生命周期的ko's component documentation

  

如果组件绑定的名称值发生显着变化,或者如果是   封闭控制流绑定会导致容器元素   删除,然后调用viewmodel上的任何dispose函数   在从DOM中删除容器元素之前

我不确定为什么我的组件会被this fiddle处理。

<div data-bind='component: { name: "some-component", params: foo }'>
    <p data-bind="text: name"></p> 
</div>
function ComponentViewModel(params) {
}

ComponentViewModel.prototype.dispose = function() {
    console.log('disposing...');
};

ko.components.register('some-component', {
    viewModel: ComponentViewModel, 
    template : '<div></div>'
});

var rootvm = {
    foo : ko.observable('1')
};

ko.applyBindings(rootvm);

setTimeout(function() {
    rootvm.foo('2'); // this is disposing ComponentViewModel, why ??
}, 3000);

在我的小提琴上发生的文档中,我看不出上述任何一点。如果component注入更改,我当然不希望disposedre-instantiatedparams

为什么会发生这种情况?

1 个答案:

答案 0 :(得分:1)

您正在以错误的方式传递组件参数:KnockoutJs需要一个具有键和值的对象,您传入一个observable。我没有深入研究为什么最终触发处理的细节,但如果你按预期传递一个对象,则不再调用dispose函数。

<div data-bind='component: { name: "some-component", params: {foo: foo} }'>
    <p data-bind="text: name"></p> 
</div>