映射ko.mapping.fromJS值时为null

时间:2013-01-15 11:28:10

标签: knockout.js knockout-mapping-plugin

我正在使用knockoutjs,并且我试图从JSON数据填充ViewModel实例。 根据knockoutjs文档,我可以使用此声明:

ko.mapping.fromJS(data, viewModel);

这是我的代码:

 var pledgeVM=function(){

      this.name=ko.observable();
      this.Assets=ko.observableArray([]);

      this.StartEdit=function(assetModel){


      };

 };

        pledge = {"name":"Moses","Assets":[{"CityId":13,"commetns":null},{"CityId":14,"commetns":null}]};

        var pledgeVMinstance=new pledgeVM();

        ko.mapping.fromJS(pledge,pledgeVMinstance);

由于某种原因未填充数据(pledgeVMinstance.name()未定义) 除非我将声明改为:

 ko.mapping.fromJS(pledge,{},pledgeVMinstance);

可能有人可以解释我为什么 事情就是这样。

由于

2 个答案:

答案 0 :(得分:22)

这是因为ko.mapping.fromJS具有以下签名:

ko.mapping.fromJS(data, mappingOptions, viewModel);

data - 是您的json数据mappingOptions - 是映射插件如何映射日期的说明,viewModel - 是存储映射数据的对象。

ko.mapping.fromJS(data) - 此语法将创建视图模型。

ko.mapping.fromJS(data, mappingOptions) - 这将创建具有特定选项的视图模型。

ko.mapping.fromJS(data, {}, viewModel) - 这个人在没有映射选项的情况下转换您的数据,并将其放入查看模型。

阅读文档以便更好地理解:http://knockoutjs.com/documentation/plugins-mapping.html

答案 1 :(得分:5)

基于阅读Knockout's website上的文档,我相信致电:

var viewModel = ko.mapping.fromJS(data);

会自动为您创建一个ViewModel。这意味着您不需要自己声明ViewModel,因为映射插件会创建一个具有可观察属性的插件。

第一次中调用此功能后,您可以使用

ko.mapping.fromJS(data, viewModel);

要更新ViewModel数据,请在通过ajax请求加载更多数据后说明。

解决此问题的解决方案应该是:

var pledge = {"name":"Moses","Assets":[{"CityId":13,"commetns":null},{"CityId":14,"commetns":null}]};

var pledgeVMinstance = ko.mapping.fromJS(pledge);