2012-02-13 65 views
1

我想通过AJAX加载模型属性的值,但是在AJAX完成时视图不会更新。有没有办法让映射异步填充模型的属性并自动更新视图?

我使用基因敲除2.0.0和基因敲除2.0.3。

的jsfiddle:

http://jsfiddle.net/rsfTy/

HTML:

<p>Code: <span data-bind="text: item.code"></span></p> 
<p>Value: <span data-bind="text: item.value"></span></p> 

的JavaScript:

var ViewModel = function() { 
    var self = this; 

    self.item = ko.mapping.fromJS({ "code": "123" }); 

    self.load = function() { 
     jQuery.ajax({ 
      "success": function() { 
       ko.mapping.fromJS({ "value": "abc" }, {}, self.item); 
      }, 
      "url": "/echo/json" 
     });    
    }; 

    self.load(); 
}; 

ko.applyBindings(new ViewModel()); 

在此示例中,显示的值为item.code,因为它是在初始化视图模型时定义的,但由于是异步填充的,所以从不显示item.value的值。

我已经试过ko.observableko.mapping.fromJS的各种排列,无论是属性初始化还是更新,都无济于事。

我想避免 - 如果可能 - 手动初始化所​​有item的属性。

我也知道我可以将ko.applyBindings移动到AJAX调用的success之内,但我拥有多个这样的属性,为此我必须实现队列系统,这是一个矫枉过正的行为。

我在做什么错?什么是正确的方法呢?

回答

3

当您进行初始映射时,UI将不会有“值”可观察的绑定对象。因此,当您通过映射插件进行更新时,它将创建“值”可观察值,但已为时过晚(因为UI已经通过绑定)。

如果初始化为:self.item = ko.mapping.fromJS({ "code": "123", "value": "" });那么它将正常工作。

+0

这是有道理的,但我从数据库中提取〜20个字段,并且必须事先用手初始化所有这些字段是有点丑陋的;这是唯一的方法吗? – Albireo 2012-02-14 08:32:44

+0

我遇到了同样的问题。我创建了一个从服务器填充的默认模型,然后在客户端进行序列化。然后,我使用基于默认模型的ko.mapping.fromJS创建一个默认视图模型。 – jaffa 2012-02-14 10:39:55

+0

您必须有一个空白模型来初始化它,或者等待在您的用户界面上调用ko.applyBindings,直到从服务器接收到一些数据。 – 2012-02-14 14:53:07

相关问题