2015-10-16 6 views
1

У меня есть observableArray с observable properties. Я хочу установить статус элемента observableArray всякий раз, когда добавляется элемент/любое свойство элемента.Нокаутная наблюдаемая матрица Change Event

function ViewModel() { 
this.myArray=ko.observableArray([]); 
} 
var viewModel = new ViewModel(); 
    $(function(){ 
     ko.applyBindings(viewModel); 
     viewModel.myArray.push({Value1:ko.observable("Test"),Value2:ko.observable("Test1"),Status:ko.observable('Added')}); 

}); 

Когда observableArray детали модифицируется (From UI or from Code) я хочу fire change event с этим пунктом.

Ex: - Измененный код

viewModel.myArray()[0].Value1("newTest1"); // At this point i need change event with changed array item. 

Пожалуйста, подсказывают, как я могу добиться этого. Ваши усилия будут оценены.

+0

изменения, внесенные в observableArray (удалить/добавить) будет уведомлены не там внутреннее содержание см образца здесь http://jsfiddle.net/LkqTU/27274/. –

+0

Если этот массив привязан к HTML, а пользователь меняет значение из пользовательского интерфейса, он автоматически обновляет наблюдаемый массив. Я хочу изменить статус этого элемента из «Добавлен в Модифицированный». Есть ли другой способ достичь этого? – Sunny

+0

да, есть, позволь мне получить скрипку для тебя. идея проста, а скорее подписывается на наблюдаемый массив, который пытается подписаться на уровне ребенка (наблюдаемый). –

ответ

0

Как уже упоминалось в комментариях выше, вам необходимо подписаться на observable, а пытаться подписаться на наблюдаемыйArray (поскольку он получает уведомление только при добавлении/удалении).

ViewModel:

function child(data) { 
    var self = this; 
    self.Value1 = ko.observable(data.Value1); 
    self.Value2 = ko.observable(data.Value2); 
    self.Status = ko.observable(data.Status); 
    ko.computed(function() { 
     self.Value1(); 
     self.Value2(); // subscribing multiple observables 
     if (!ko.computedContext.isInitial()) { //status remains intact initially(onLoad) 
      self.Status('Modified'); 
     } 
    }); 
} 

function ViewModel() { 
    var self = this; 
    self.myArray = ko.observableArray([]); 
} 
$(function() { 
    ko.applyBindings(new ViewModel()); 
}); 

работает образец до here

Вы можете найти выше, я использую computedContext с функцией isInitial

isInitial() - функция, которая возвращает true, если вызывается во время первого когда-либо оценка текущего вычисленного наблюдаемого, или false в противном случае. Для чистых вычисленных наблюдаемых isInitial() всегда undefined.

вычислена документация here

0

Вы можете использовать какое-то (личное) вычисленное поле, в котором вы будете перебирать все доступные вам свойства. Когда что-то изменится в дальнейшем это вычисленный, он будет пересчитывать, и вы получите уведомление

ko.computed(function(){ 
    viewModel.collection().forEach(function(element){ 
     var a = element.text(); 
    }); 
} 

В этом примере, когда массив изменяется или любой текстовый элемент изменен весь вычислительный пересчитывается, и вот вам может установить нужный вам статус

+0

Если этот массив привязан к HTML, а пользователь меняет значение из пользовательского интерфейса, он автоматически обновляет наблюдаемый массив. Я хочу изменить статус этого элемента из «Добавлен в Модифицированный». Есть ли другой способ достичь этого? – Sunny

+0

Вы можете использовать observable.subscribe (например, текст.подписаться) и обновить статус – Andrey

+0

Другой способ - вы можете сделать статус вычисленным полем, которое будет сравнивать текущее значение и начальное и вернуть соответствующий статус – Andrey