【问题标题】:ViewModel not updating when calling a function update()调用函数 update() 时 ViewModel 不更新
【发布时间】:2015-09-23 18:24:31
【问题描述】:

我有这个功能:

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,多次调用时不能正确绑定。

【问题讨论】:

  • 如果您多次调用updatedata,您可能会多次调用ko.applyBindings,这势必会给您带来错误。你检查过控制台吗?此外,您是否有可能稍微重写问题中的代码,以便重现您的场景?
  • 另外,你应该仔细阅读the mapping documentation,它有一些关于如何更新使用该插件创建的视图模型的信息。

标签: javascript jquery json knockout.js


【解决方案1】:

您不应多次应用绑定(这会引发错误 - 检查您的控制台)。

不用每次都重新创建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 }

【讨论】:

    猜你喜欢
    • 2012-09-04
    • 1970-01-01
    • 2021-04-29
    • 2021-12-28
    • 1970-01-01
    • 2011-08-09
    • 2011-05-30
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多