applyBinding () не работает, если он вызывается только один раз
Я учусь работать с knockout.js и столкнулся с некоторыми недоразумениями.
UI:
<ul>
<li>
<p>
Caption:<span data-bind="text: object1.Caption" />
</p>
</li>
<li>
<p>
Manufacturer: <span data-bind="text: object1.Manufacturer" />
</p>
</li>
</ul>
JS:
var viewModel = {
object1: ko.observable()
}
$(document).ready(function () {
ko.applyBindings(viewModel);
}
);
function getData ()
{
var response = $.ajax({
type: "GET",
datatype: "json",
url:// my URL,
success: function (data) {
var result = jQuery.parseJSON(data);
viewModel = ko.mapping.fromJS(result);
**//ko.applyBindings(viewModel);**
}
});
}
Данные JSON:
{"object1":{
"Caption": "Some caption",
"Manufacturer": "Some manufacturer"
}
}
Кажется, я следовал инструкциям, но если я попытаюсь вызвать applyBindings(viewModel) только один раз при запуске - это не сработает. Но это работает, если я вызываю его каждый раз в функции getData().
Что случилось? Как заставить это работать, используя только один вызов applyBindings при запуске?
Спасибо за вашу помощь.
2 ответа
Вам нужно использовать перегрузку обновления fromJS, а не переназначать ее на viewModel:
success: function (data) {
var result = jQuery.parseJSON(data);
ko.mapping.fromJS(result, viewModel);
}
В вашем случае вы также можете использовать метод from JSON и сохранить вызов в jQuery:
success: function (data) {
ko.mapping.fromJSON(data, viewModel);
}
Вам также нужно будет инициализировать все свойства при первом создании viewModel:
var viewModel = {
object1: ko.observable(
{
"Caption": ko.observable(''),
"Manufacturer": ko.observable('')
})
}
ko.mapping.fromJS возвращает новый экземпляр объекта каждый раз, когда вы вызываете его. Вот почему вам нужно вызывать applyBindings каждый раз, когда вы получаете новые данные с сервера.
Если вы хотите иметь только один applyBindings, вам нужно иметь обычный ViewModel и обновлять его свойства из выбранных данных один за другим или используя какой-либо самостоятельно реализованный метод пакетного обновления в вашей viewmodel.