【问题标题】:Knockout mapping plugin options淘汰赛映射插件选项
【发布时间】:2013-07-16 02:23:56
【问题描述】:

我不确定如何指示插件使内部数组的特定属性不可观察。

将此 JSON 作为我的数据:

{
    Id: 1,
    Description: "test",
    Roles: [{ Id: 1, Name: "Role 1" }, { Id: 2, Name: "Role 2" }]
}

Roles 数组应该是可观察的,但我不想让任何项目的“Id”字段可观察,我正在尝试不同的方法,但没有运气:

ko.mapping.fromJS(data, { 'copy': [ "Roles.Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[].Id" ] });
ko.mapping.fromJS(data, { 'copy': [ "Roles[0].Id" ] }); // this only works with the first item

有什么想法吗?

【问题讨论】:

    标签: knockout.js mapping observable


    【解决方案1】:

    我不知道您的问题是否有直接的解决方案,我尝试导航到 Roles 数组的后代,但没有工作(如您的尝试),但您可以通过为 @ 定义模型来制作简单的技巧987654323@物品对象:

    function RolesModel(id, name) {
        this.Id = id;
        this.Name = ko.observable(name);
    }
    

    然后使用映射配置来控制 Roles 对象的创建,如下所示:

    var mapping = {
        'Roles': {
            create: function (options) {
                return new RolesModel(options.data.Id, options.data.Name)
            }
        }
    }
    

    正如我告诉你的那样,我不知道直接的解决方案,但这会起作用。请检查我的DEMO

    【讨论】:

      【解决方案2】:

      好的,也许我找到了解决方案,从@ebram tharwat 建议开始。

      我将映射选项一分为二:

      var mappingRole = { 'copy': ["Id"] };
      
      var mapping = {
          'Roles': {
              create: function (opts) {
                  return ko.mapping.fromJS(opts.data, mappingRole);
              }
          }
      };
      

      然后我的原始映射可能是这样的:

      ko.mapping.fromJS(data, mapping);
      

      并且似乎工作正常,不确定性能,但对我来说更重要的是不必手动定义后代视图模型。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 2012-06-08
        • 1970-01-01
        • 2012-12-05
        • 2015-03-30
        • 2012-04-13
        相关资源
        最近更新 更多