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.

Другие вопросы по тегам