【问题标题】:Knockout is not mapping the properties of an object in an array淘汰赛没有映射数组中对象的属性
【发布时间】:2012-04-27 20:10:59
【问题描述】:

knout 似乎没有正确映射数组中对象的属性。

从 chrome 控制台查看此示例:

> var viewmodel = ko.mapping.fromJS({list:[]});
undefined

> viewmodel.list().unshift({ name : ko.observable("Foo") });
1

> viewmodel.list()[0].name();
"Foo"

> var js = ko.mapping.toJS(viewmodel);
undefined

> js.list[0].name;
undefined

所以 javascript 对象正在创建中,但 'name' 属性没有被映射。

非常欢迎任何想法!

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin


    【解决方案1】:

    来自http://knockoutjs.com/documentation/plugins-mapping.html,关于toJS()函数:

    这将创建一个未映射的对象,其中仅包含作为原始 JS 对象一部分的映射对象的属性。

    由于“名称”不是您映射的原始对象的一部分,因此它不会被取消映射。您需要告诉映射插件包含此特定属性:

    var js = ko.mapping.toJS(viewmodel, { include: ['name'] });
    

    【讨论】:

    • 感谢您的快速回答。有没有办法修改行为以映射每个属性?文档似乎没有提到这一点。
    • @RichardAstbury 我不这么认为。您需要将其硬编码到映射插件的自定义版本中。
    • 我发现 ko.toJSON(viewModel) 似乎可以完成这项工作。
    【解决方案2】:

    虽然 Niko 的回答是正确的 - 有办法克服这个问题..

    我不得不说这有点难看,但它确实有效,而且很容易理解:

    ko.mapping.toJS(ko.mapping.fromJSON(ko.toJSON(viewmodel)))
    

    我将视图模型从 observable 映射到 json 到 observable(所有属性都映射)到 object。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多