knockout.mapping.js, возможно ли обновить только часть сопоставленной переменной? - PullRequest
1 голос
/ 26 февраля 2012

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

$.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?

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


Редактировать:

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

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

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

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


EDIT2:

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

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

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

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

или

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

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

1 Ответ

2 голосов
/ 26 февраля 2012

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

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

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

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

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

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

...