映射ko.mapping.fromJS值时为null

hap*_*400 8 knockout-mapping-plugin knockout.js

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

ko.mapping.fromJS(data, viewModel);
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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);
Run Code Online (Sandbox Code Playgroud)

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

ko.mapping.fromJS(pledge,{},pledgeVMinstance);
Run Code Online (Sandbox Code Playgroud)

可能有人可以解释我为什么会这样.

谢谢

Art*_*kov 22

它发生是因为ko.mapping.fromJS有以下签名:

ko.mapping.fromJS(data, mappingOptions, viewModel);
Run Code Online (Sandbox Code Playgroud)

其中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

  • 这只是部分正确.如果你用两个参数调用:`ko.mapping.fromJS(data,mappedObject)`其中第二个参数是一个已经由映射插件创建的"mappedObject"(因此它定义了`__ko_mapping__`属性)它会对待第二个参数作为viewModel而不作为选项.请参阅:https://github.com/SteveSanderson/knockout.mapping/blob/master/knockout.mapping.js#L96.这是文档中的更新示例`ko.mapping.fromJS(data,viewModel);`的工作原理. (10认同)

Sto*_*out 5

基于阅读Knockout网站上的文档,我相信:

var viewModel = ko.mapping.fromJS(data);
Run Code Online (Sandbox Code Playgroud)

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

在您第一次调用它之后,您可以使用它

ko.mapping.fromJS(data, viewModel);
Run Code Online (Sandbox Code Playgroud)

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

解决这个问题的解决方案应该是:

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

var pledgeVMinstance = ko.mapping.fromJS(pledge);
Run Code Online (Sandbox Code Playgroud)