9

我正在使用 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);

也许有人可以解释我为什么事情会这样。

4

2 回答 2

23

发生这种情况是因为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

于 2013-01-15T12:01:50.653 回答
5

根据阅读Knockout 网站上的文档,我相信调用:

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);
于 2013-01-15T11:51:58.173 回答