根据组件生命周期的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
注入更改,我当然不希望disposed
为re-instantiated
和params
。
为什么会发生这种情况?
答案 0 :(得分:1)
您正在以错误的方式传递组件参数:KnockoutJs需要一个具有键和值的对象,您传入一个observable。我没有深入研究为什么最终触发处理的细节,但如果你按预期传递一个对象,则不再调用dispose函数。
<div data-bind='component: { name: "some-component", params: {foo: foo} }'>
<p data-bind="text: name"></p>
</div>