【问题标题】:When mapping ko.mapping.fromJS values are null当映射 ko.mapping.fromJS 值为 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);

也许有人可以解释一下为什么会这样。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案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]);
    猜你喜欢
    • 2017-01-28
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 2016-05-21
    • 2013-08-10
    • 2020-06-24
    • 2012-01-08
    • 1970-01-01
    相关资源
    最近更新 更多