1

В моем JS у меня есть следующий вызов ajax, который связывает полученный json с использованием плагина отображения нокаута.knockout.mapping.js, Можно ли обновить только часть отображаемой переменной?

$.getJSON("/Game/GetRack", function (data) { 
    game.rack = ko.mapping.fromJS(data); 
    ko.applyBindings(game.rack, $('.rack')[0]); 
}); 

/Get/GetRack возвращается:

[{"Color":3,"Letter":"a","Points":5},null,null]

Как вы можете видеть, есть только один объект в массиве. Остальные два являются нулями.

Теперь, используя отображение нокаута я могу сделать:

ko.mapping.fromJS([null, { Color: 55, Letter: "b", Points: 88 }, null], game.rack); 

Это правильно обновляет мой взгляд, и теперь я вижу только письмо B на второй позиции. Остальные два являются нулями.

Мои вопросы: Можно ли обновить значение в определенном месте, не используя mapping.fromJS?

Так предполагая, у меня есть буквы А с индексом 0, я хочу, чтобы изменить второй нуль на
{ Color: 55, Letter: "b", Points: 88 }
и сделать мой UI автоматически обновит напоминать это изменение. Как это может быть сделано?


Edit:

Я решил пойти с примером, приведенным Джоном Earles. К сожалению, у меня все еще есть проблема, потому что мой массив двухмерен.

У вас есть образец здесь: http://jsfiddle.net/wgZ59/29/
(это очень похоже на примере Джона Earles', но включает в себя двумерный массив).

Может кто-нибудь указать, почему нажатие на кнопку изменения не меняет значения элементов? Можно ли изменить их значения без вызова HasMutated()?

И последний (только если две предыдущие решены). Возможно ли создать html-таблицу статически (потому что, например, я знаю, что она всегда будет 3x3, поэтому я хочу две таблицы печати с тремя строками и тремя столбцами, а затем привязать каждую отдельную ячейку к моим ячейкам матрицы. Я уже это пробовал, проблемы, потому что нокаута не имеет значения для клеток ...


EDIT2:

мне удалось ответить на мои выше вопросы сам, скрипка примера здесь:

http://jsfiddle.net/wgZ59/44/

Итак, я могу е статической таблицы и связать отдельные клетки, когда я Объявите массив следующим образом:

self.matrix = ko.observableArray([[0,0,0],[0,0,0],[0,0,0]]);

или

self.matrix = ko.observableArray([[,,],[,,],[,,]]);.

Я могу обновить значения и работает для статической таблицы, но это не работает для динамической таблицы (динамически создаваемой нокаутом). Вы можете увидеть поведение на странице скрипта (ссылка в начале этого редактирования). Знаете ли вы, почему нажатие кнопки «изменить» не обновляет значения в динамически созданной таблице?

ответ

2

Я не знаю точно, что вы пытаетесь сделать, но если game.rack является наблюдаемым массивом, вы можете манипулировать им с помощью JavaScript.

Вот страница документации на observableArrays:

http://knockoutjs.com/documentation/observableArrays.html

Эта страница показывает доступные «вспомогательные» методы, которые доступны на самой observableArray. Кроме того, вы можете манипулировать базовым массивом, но тогда вы должны вызвать 'valueHasMutated()' в наблюдаемом массиве, чтобы любые зарегистрированные слушатели знали об изменениях.

Вот простой JSFiddle показывая манипуляция:

http://jsfiddle.net/jearles/wgZ59/8/

+0

Спасибо Джон. Я решил следовать вашему шаблону дизайна, но у меня все еще есть проблемы. Можете ли вы посмотреть мой EDIT? –

+1

Нокаут действительно просто предпочитает работать с объектами. Отслеживание зависимостей имеет проблемы с отслеживанием ссылок на данные. Ниже приведена скрипка, но для этого требуется изменить массив простых объектов: [{v: 1}, {v: 2}, {v: 3}]. http://jsfiddle.net/jearles/wgZ59/46/ Одним из преимуществ работы с объектами является то, что преобразователь превратит их в наблюдаемые, и поскольку вы теперь меняете наблюдаемый, вам не понадобится вызов valueHasMutated() больше. –

+0

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