#knockout.js #knockout-mapping-plugin
#knockout.js #нокаут-сопоставление-плагин
Вопрос:
Я использую knockout.js amp; knockout.mapping.js . Я меняю ресурс данных на ajax, данные не могут обновляться динамически.
Потому что в реальном проекте я хочу настраивать html-модули без изменения js-кода, а данные не являются точными, поэтому структура данных сложная и динамичная. Две главные цели, которых я хочу достичь:
1, многоуровневые данные, поэтому я использую knockout.mapping, но это не работает. Вот один из примеров: http://jsfiddle.net/8uKaL /
2, динамический источник, ресурсы могут быть есть data2, data3, ...
, и я могу легко изменить исходную ссылку из data2
в data3
, поэтому я подумал, что мне следует использовать что-то вроде <div data-bind="foreach: resources_ajax(key)" data-key="data1">
в html.
Есть ли какое-нибудь решение?
Спасибо.
Ответ №1:
Вам нужно подумать об этом по-другому. Knockout — это привязка модели к DOM, которая будет обновлять DOM от вашего имени. Похоже, вы пытаетесь «вызвать модель» из DOM
Обновил ваш код, чтобы показать пример, ключевую часть:
.done(function(data) {
data.data1 = JSON.parse(data.data1); // this line just for fix fake ajax request
self.resources_ajax(data.data1);
});
JSFiddle:
Комментарии:
1. Спасибо за ответ. Но в моем проекте я хочу настроить html-модули без изменения js-кода, и данные не являются достоверными. Две основные цели, которых я хочу достичь: 1, динамический источник, ресурсы могут быть
data2
,data3
, и я могу легко изменить исходную ссылку сdata2
наdata3
, поэтому я хочу использоватьdata-key
в html. 2, многоуровневый, поэтому я использую knockout.mapping.2. @Fancyoung это те детали, которые вам нужно указать в своем вопросе (желательно как можно скорее), чтобы у людей были все ключи для помощи
Ответ №2:
Что вам нужно сделать, так это сначала создать пустой массив data1. http://jsfiddle.net/8uKaL/4 /
// this will create resources_ajax.data1 as ko.observableArray()
self.resources_ajax = ko.mapping.fromJS({data1: []});
В противном случае, в вашем исходном коде, перед ajax, в вашей привязке foreach , ko будет видеть resources_ajax.data1 как undefined
, и ko никогда не узнает, что вы позже создали ключ data1
в resources_ajax .
То, что ko может «наблюдать», — это изменение содержимого resources_ajax.data1, а не создание ключа data1
для объекта resources_ajax.
Обновить
Но приведенное выше решение не решает ваш динамический вариант использования.
Вот метод, позволяющий ko воссоздать DOM после ajax. http://jsfiddle.net/8uKaL/6 /
оберните DOM в наблюдаемый флаг loading
, перед ajax установите loading
значение true
, после ajax установите loading
значение false
, это заставит ko повторно проанализировать внутреннюю привязку и заново создать DOM.