Почему компонент, размещаемый в параметрах, изменяется?

В соответствии с документацией по компоненту ко на жизненном цикле компонента:

Если значение имени привязки компонента изменяется заметным образом или если привязка потока управления влечет за собой удаление элемента контейнера, то любая функция 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);

Я не вижу ни одного из вышеперечисленных пунктов в документации на моей скрипке. Я, конечно, не ожидаю component быть disposed а также re-instantiated если params введенное изменение.

Есть идеи, почему это происходит?

1 ответ

Решение

Вы передаете параметры компонента неверным образом: KnockoutJs требует объект с ключами и значениями, а вы передаете наблюдаемый. Я не стал вдаваться в детали того, почему это приводит к удалению, но если вы передадите объект так, как он ожидает, функция dispose больше не вызывается.

<div data-bind='component: { name: "some-component", params: {foo: foo} }'>
    <p data-bind="text: name"></p> 
</div>
Другие вопросы по тегам