我正在学习如何使用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 的一次调用来使其工作?
感谢您的帮助。
答案 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中使用一些自我实现的批量更新方法。