KnockoutJS правильный способ обновления observableArray AJAX - PullRequest
6 голосов
/ 19 марта 2012

В KnockoutJS, как правильно обновлять observableArray данных JSON при каждом запуске команды AJAX?

Прямо сейчас я очищаю массив, используя что-то вроде viewmodel.items ([])затем заполняет его данными JSON с сервера.Если не использовать плагин сопоставления KnockoutJS (который может быть единственным способом сделать это), каков правильный путь?

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

//// Добавляю, как я это делаю сегодня ////

Я не уверен, почему я делаю это так, но я так и думалкак обновить.В общем, как я уже говорил, я получаю данные JSON, а затем передаю их примерно так:

    _model.addIncident = function (json) {
       var checked = json.UserTouches > 0 ? true : false;
       _model.incidents.push({
          id: ko.observable(json.IncidentIDString),
          lastTouchId: ko.observable(json.UserLastTouchIDString),
          weight: ko.observable(json.Weight),
          title: ko.observable(json.Title),
          checked: ko.observable(checked),
          createdOn: ko.observable(json.IncidentCreatedOn),
          servicename: ko.observable(json.Servicename),
          inEdit: ko.observable(false),
          incidentHistory: ko.observableArray(),
          matchScore: ko.observable()
      });
   };

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

Ответы [ 2 ]

10 голосов
/ 19 марта 2012

ObservableArray - это на самом деле обычная наблюдаемая с некоторыми дополнительными методами для операций с массивами.

Итак, если вы хотите установить значение observableArray в новый массив, вы можете просто сделать:

viewModel.items(myNewArray)

Плагин сопоставления может помочь вам обновитьсуществующие элементы в массиве с любыми обновлениями.В этом случае ваш пользовательский интерфейс будет обновляться только после каких-либо различий.

0 голосов
/ 20 июня 2013

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

Если вы уже пометили _model.incidents как observableArray, вы можете сделать что-то подобное при привязке возвращаемых данных JSON:

eval("_model.incidents("+JSON.stringify(json)+");");

Это сработало для меня.Надеюсь, вы создали свою наблюдаемую подобную этому:

_model.incidents = ko.observableArray([]);
...