0

根据ko关于组件生命周期的组件文档:

如果组件绑定的名称值发生明显变化,或者如果封闭的控制流绑定导致容器元素被移除,则视图模型上的任何 dispose 函数都会在容器元素从 DOM 中移除之前被调用

我不确定为什么我的组件被放置在这个小提琴上。

<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);

我在我的小提琴上出现的文档中看不到上述任何一点。如果注入的变化,我当然不希望出现componentdisposedre-instantiatedparams

任何想法为什么会发生这种情况?

4

1 回答 1

1

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

<div data-bind='component: { name: "some-component", params: {foo: foo} }'>
    <p data-bind="text: name"></p> 
</div>
于 2015-09-06T21:25:27.713 回答