В моем 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:
мне удалось ответить на мои выше вопросы сам, скрипка примера здесь:
Итак, я могу е статической таблицы и связать отдельные клетки, когда я Объявите массив следующим образом:
self.matrix = ko.observableArray([[0,0,0],[0,0,0],[0,0,0]]);
или
self.matrix = ko.observableArray([[,,],[,,],[,,]]);
.
Я могу обновить значения и работает для статической таблицы, но это не работает для динамической таблицы (динамически создаваемой нокаутом). Вы можете увидеть поведение на странице скрипта (ссылка в начале этого редактирования). Знаете ли вы, почему нажатие кнопки «изменить» не обновляет значения в динамически созданной таблице?
Спасибо Джон. Я решил следовать вашему шаблону дизайна, но у меня все еще есть проблемы. Можете ли вы посмотреть мой EDIT? –
Нокаут действительно просто предпочитает работать с объектами. Отслеживание зависимостей имеет проблемы с отслеживанием ссылок на данные. Ниже приведена скрипка, но для этого требуется изменить массив простых объектов: [{v: 1}, {v: 2}, {v: 3}]. http://jsfiddle.net/jearles/wgZ59/46/ Одним из преимуществ работы с объектами является то, что преобразователь превратит их в наблюдаемые, и поскольку вы теперь меняете наблюдаемый, вам не понадобится вызов valueHasMutated() больше. –
Я работаю с объектами в своем первоначальном сценарии. Я просто понятия не имел, что это может повлиять на случай, который я опубликовал на jsfiddle. Я могу исходить отсюда, еще раз спасибо :). –