1

我正在学习如何使用 knockout.js 并遇到了一些误解。

用户界面:

<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() 函数中调用它,它就会起作用。

怎么了?如何在 start 上仅使用一次applyBindings调用使其工作?

谢谢你的帮助。

4

2 回答 2

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('')
    })
 }
于 2013-03-13T12:32:55.453 回答
0

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

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

于 2013-03-13T12:29:55.973 回答