我正在使用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);
可能有人可以解释我为什么 事情就是这样。
由于
答案 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);