调用函数update()时ViewModel不更新

时间:2015-07-06 14:37:09

标签: javascript jquery json knockout.js

我有这个功能:

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,但是当它被多次调用时不能。

1 个答案:

答案 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 }