我有这个功能:
function updatedata(data)
{
var obj = jQuery.parseJSON(data);
if(obj.hasOwnProperty('request_type'))
{
if (obj.request_type == 'client_information')
{
var ViewModel = function (Clients) {
var self = this;
this.Clients = ko.mapping.fromJSON(JSON.stringify(Clients));
};
var info = new ViewModel(obj.clients_information);
ko.applyBindings(info);
}
}
}
HTML:
<ul id="mychats" data-bind="foreach: Clients" data-role="listview">
<li class="not_selected" data-bind="id: chatid, text: client_name"></li>
</ul>
该函数被不时调用,它可以在第一次调用时正确地将数据绑定到ul,但是当它被多次调用时不能。
答案 0 :(得分:3)
您不应该多次应用绑定(这会引发错误 - 请检查您的控制台)。
不是每次都重新创建viewModel,只需将客户端信息放在一个observable中,并使用更新函数中的新客户端信息更新observable。
类似的东西:
var ViewModel = function (Clients) {
var self = this;
this.Clients = ko.observableArray(Clients); // As you use the foreach binding, I assume it's an array
};
var obj = jQuery.parseJSON(data);
var info = new ViewModel(obj.clients_information);
ko.applyBindings(info);
function updatedata(newData)
{
info.Clients(newData);
}
请参阅this fiddle。
或者如果您想使用ko.mapping
:
var viewModel = ko.mapping.fromJS(obj);
function updatedata(newData)
{
ko.mapping.fromJS(newData, viewModel);
}
这会将新数据注入现有的viewModel。
顺便说一下,没有id
绑定。请改用attr: { id: chatid }
。