当映射 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 没有被触发

KnockoutJS - 有没有简单的方法可以用单个对象覆盖 observables?

从 ASP.NET MVC 复杂模型创建 KnockoutJS 模型