如果仅调用一次,则applyBinding()不起作用

时间:2013-03-13 12:28:21

标签: knockout.js knockout-mapping-plugin

我正在学习如何使用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 个答案:

答案 0 :(得分: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('')
    })
 }

答案 1 :(得分:0)

每次调用它时,

ko.mapping.fromJS都会返回一个新的对象实例。这就是每次从服务器获取新数据时都需要调用applyBinding的原因。

如果您只想拥有一个applyBindings,则需要拥有一个普通的ViewModel,并从逐个获取的数据中更新它的属性,或者在viewmodel中使用一些自我实现的批量更新方法。