当映射 ko.mapping.fromJS 值为 null
Posted
技术标签:
【中文标题】当映射 ko.mapping.fromJS 值为 null【英文标题】:When mapping ko.mapping.fromJS values are null 【发布时间】:2012-12-29 11:49:57 【问题描述】:我正在使用 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);
也许有人可以解释一下为什么会这样。
【问题讨论】:
【参考方案1】:根据阅读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);
【讨论】:
我需要在我的承诺视图模型中使用 StartEdit 功能【参考方案2】:这是因为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
【讨论】:
这只是部分正确。如果您使用两个参数调用:ko.mapping.fromJS(data, mappedObject)
,其中第二个参数是映射插件已经创建的“mappedObject”(因此它定义了__ko_mapping__
属性),它将第二个参数视为 viewModel 而不是选项。请参阅:github.com/SteveSanderson/knockout.mapping/blob/master/…。这就是文档中更新示例ko.mapping.fromJS(data, viewModel);
的工作方式。
所以在文档中当您使用 2 个参数时 - 第二个是选项?那么为什么它是“ko.mapping.fromJS(数据,viewModel);”第二个是viewModel?
对不起,现在看到下面的评论-非常感谢,现在我明白了
谢谢,我也应该使用 RTFM... 就在一秒钟前,我正在尝试使用两个选项,但无法弄清楚发生了什么。干得好。
谢谢阿特姆。你今天为我节省了很多时间。不幸的是,这种变化对我来说没有任何意义。它在一个地方的两个参数上工作得很好,但只能在另一个地方的三个参数上工作 - ko.mapping.fromJS(returnData.Data, , window[dataStoreId]);以上是关于当映射 ko.mapping.fromJS 值为 null的主要内容,如果未能解决你的问题,请参考以下文章
knockout 学习使用笔记----绑定map--双向绑定
“未捕获的 TypeError:无法处理绑定”与 KnockoutJS
Knockout ViewModel 在 ajax 之后被更新,但我的 foreach 没有被触发