Использование среза с массивом, созданным подключаемым модулем сопоставления Knockout

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

var grid = {};
grid.Model = function (jsondata) {
 var viewModel = {
  items: ko.observableArray()
 };

 $.getJSON('/api/test/items', function (data) {
  viewModel.items= ko.mapping.fromJS(data);
  ko.applyBindings(viewModel)
 });

 viewModel.itemsOnCurrentPage = ko.computed(function () {
  return viewModel.items.slice(1, 10);
 }, viewModel);    
};

Я пытаюсь выполнить привязку к itemsOnCurrentPage (foreach: itemsonCurrentPage). Привязка непосредственно к элементам работает нормально. Это работало, когда я вручную создавал свой массив на стороне клиента. Теперь я получаю данные через jQuery и использую плагин сопоставления. Я не могу понять, что мне не хватает. Любая помощь приветствуется.


person Mark    schedule 29.02.2012    source источник
comment
Можете ли вы подключить JSFiddle для демонстрации.   -  person madcapnmckay    schedule 29.02.2012


Ответы (2)


РП правильный.

Вот JSFiddle, который показывает, что вы делаете:

http://jsfiddle.net/jearles/P99zy/

Вот работающее обновление:

http://jsfiddle.net/jearles/P99zy/2/

Единственная разница заключается в том, как я загружаю элементы таблицы.

person John Earles    schedule 29.02.2012

Ваша проблема в том, что вычисляемый наблюдаемый объект itemsOnCurrentPage связан с вашим исходным observableArray. Когда вы делаете viewModel.items = ko.mapping.fromJS(data), вы устанавливаете viewModel.items равным новому observableArray (тот, с которым itemsOnCurrentPage не связан).

Вместо этого вы можете сделать: ko.mapping.fromJS(data, {}, viewModel.items) чтобы обновить существующий observableArray.

person RP Niemeyer    schedule 29.02.2012
comment
Спасибо. В этом есть смысл. Я понимаю, что я делаю неправильно. Теперь мне нужно найти решение. Я не хочу обновлять viewModel.items. Я просто хочу показать «кусочек» viewModel.items. - person Mark; 29.02.2012
comment
Вы определенно можете использовать itemsOnCurrentPage. Вы просто хотите обновить существующий observableArray, когда ваш запрос AJAX вернется. - person RP Niemeyer; 29.02.2012