Я следующий компонент:Нокаута компонент с наблюдаемым объектом не обновляет данные
<template id="fruits-tpl">
<p>Name: <input data-bind="value: name" /></p>
<p>Type: <input data-bind="value: color" /></p>
</template>
ko.components.register('fruits', {
viewModel: function(params) {
this.name = params.name;
this.color = params.color;
},
template: { element: 'fruits-tpl' }
});
Я использую этот компонент вместе с моделью зрения ниже, где элементы в моем наблюдаемом списке имеют различные типов и имеют различные свойства:
function Fruit(data) {
this.name = ko.observable(data.name);
this.color = ko.observable(data.color);
}
function Dessert(data) {
this.name = ko.observable(data.name);
this.packaging = ko.observable(data.packaging);
}
function Vm(){
var data = [{name:"Apples",color:"Yellow"},{name:"Cookies",packaging:"Box"}];
this.items = ko.observableArray([new Fruit(data[0]),new Dessert(data[1])]);
this.items.choice = ko.observable(this.items()[0]);
}
Этот компонент работает очень хорошо, и лежащие в основе данных обновляется каждый раз, когда я изменить текст в моих полях ввода:
<div data-bind="component: {name: 'fruits', params: items.choice}"></div>
Теперь я хотел бы, чтобы инкапсулировать логику моих наблюдаемые в самом компонент, поэтому я изменил компонент таким образом:
ko.components.register('fruits', {
viewModel: function(params) {
this.name = ko.observable(params.name);
this.color = ko.observable(params.color);
},
template: { element: 'fruits-tpl' }
});
... и теперь у меня есть моя наблюдаемая items.choice с только лишь данные внутри:
function Vm(){
var data = [{name:"Apples",color:"Yellow"},{name:"Cookies",packaging:"Box"}];
this.items = ko.observableArray(data);
this.items.choice = ko.observable(this.items()[0]);
}
Почему идут исходные данные в основном ViewModel не обновляются в моем втором примере, хотя items.choice еще наблюдаемая? Я уверен, что мне не хватает некоторых концепций, возможно, каждый элемент в моем наблюдаемом массиве также должен быть наблюдаемым, но я не понимаю, есть ли способ заставить второй пример работать.
Первый пример: http://jsfiddle.net/5739ht0q/2/ Второй пример: http://jsfiddle.net/079tx0nn/
Вы создаете наблюдаемые внутри компонента. Там они обновляются. То, что вы печатаете, - это данные, которые передаются вашему компоненту, и он не обновляется. Вы не можете смотреть на данные, созданные внутри вашего компонента из-за пределов его. –
Да, есть ли способ обновить данные до массива элементов? – deblocker