Лучший способ получить только измененные строки из observableArray (когда есть опция массового редактирования) - PullRequest
5 голосов
/ 29 декабря 2011

У меня есть коллекция ObservableArray, которая связывается с таблицей HTML с возможностью массового редактирования (MVC3), каждый раз, когда пользователь нажимает на коммит, я хотел отправлять только измененные строки из коллекции вместо отправки всего списка видовых моделей, пожалуйста, сообщитеесли есть лучший способ отслеживать или фильтровать только измененные строки.

Ответы [ 2 ]

15 голосов
/ 29 декабря 2011

Вот сообщение о создании грязного флага в Knockout, который будет отслеживать изменения всех наблюдаемых в объекте.

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

Вот пример, который показывает грязный флаг на каждом элементе и вычисляемую наблюдаемую, которая содержит только грязные элементы: http://jsfiddle.net/rniemeyer/wauwn/

2 голосов
/ 29 декабря 2011

Это не так тривиальная задача, как может показаться.

Сначала наблюдаемый массив обрабатывает только модификацию массива (вставка, удаление, изменение порядка и т. Д.), А не модификацию элемента.

Во-вторых, вам, вероятно, понадобится специальный флаг, например, isModified, который привязывается к каждой строке таблицы.

Тогда вам нужно установить этот флаг, если часть привязки была обновлена. Knockoutjs observables предоставляет метод подписки, который позволяет вызывать вашу собственную функцию при обновлении observables. Взгляните на страницу http://knockoutjs.com/documentation/observables.html, внизу есть раздел, который называется «явная подписка на наблюдаемые».

Существует быстрый набросок кода, который выполняет эту задачу

function CreateArrayElementViewModel(inputData) {
     // Creating our view model
     var result = {
           prop : ko.observable(inputData.prop),
           val : ko.observable(inputData.val),
           isModified: false // This property would be true if entity was edited
     };     
     // Iterate over all properties and subscribe to knockoutjs observables
     for(prop in result) {
          if (typeof(result[prop].subscribe) != 'undefined') {
               result[prop].subscribe(function() { result.isModified = true; });
          }
     }

     return result;
}
...