【问题标题】:Knockout Mapping plugin - map objects to observablesKnockout Mapping 插件 - 将对象映射到可观察对象
【发布时间】:2012-12-03 14:48:45
【问题描述】:

我想使用剔除映射插件,但我需要模型上的对象本身就是属性(主要是因为它们需要可替换)。

考虑一个使用以下模型的大大简化的示例:

{
  family: {
    patriarch: {
      name: "Fred Flintstone", child: "Pebbles"
    }
  },
  allPeople: [
    {name: "Fred Flintstone", child: "Pebbles"},
    {name: "Wilma Flintstone", child: "Pebbles"},
    {name: "Barney Rubble", child: "Bam Bam"}
  ]
}

假设我希望能够通过一个选择来修改族长,其中选项是 allPeople,其中更改选择可能会产生很多副作用。

映射插件使所有名称属性都可观察,allPeople 成为 observableArray,但为了让我的选择正常工作,族长对象本身必须是可观察的。

编写我自己的粗略映射器总共需要 13 行代码,但由于映射插件功能如此齐全,我希望有一个选项或其他方法可以让这个看似常见的场景正常工作。

【问题讨论】:

    标签: knockout.js knockout-mapping-plugin knockout-2.0


    【解决方案1】:

    这个怎么样?对于选择:

    <select data-bind="options: allPeople, optionsText: 'name', value: family.patriarch"></select>
    

    并且在设置映射时,不是为 patriarch 属性指定子视图模型,而是使用初始数据返回一个 observable:

    var data = {
      family: {
        patriarch: {
          name: "Fred Flintstone", child: "Pebbles"
        }
      },
      allPeople: [
        {name: "Fred Flintstone", child: "Pebbles"},
        {name: "Wilma Flintstone", child: "Pebbles"},
        {name: "Barney Rubble", child: "Bam Bam"}
      ]
    };
    
    
    var mapping = {
        'patriarch': {
            create: function (options) {
                return ko.observable(options.data);
            }
        }
    }
    
    var vm = ko.mapping.fromJS(data, mapping);
    
    vm.family.patriarch.subscribe(function(value) {
        alert(ko.toJSON(value));
    });
    
    ko.applyBindings(vm);
    

    在这里拉小提琴:

    http://jsfiddle.net/SZXDG/6/

    这能满足你的需要吗?

    【讨论】:

    • vm.family.patriarch 的值被设置为allPeople 中的第一个对象。例如,如果您将data.family.patriarch.name 的值更改为“Wilma Flintstone”,“Fred Flintstone”仍会出现在警告框中。
    • 如果添加“alert(ko.toJSON(options.data));”在 create 方法中,您可以看到它默认 observable 为正确的数据,但显然 select 的绑定不太正确,因为订阅立即触发,表明基础选定值已重置为第一个条目。但是随后的更改确实会正确更改 observable 的值。我将尝试对选择绑定进行排序。
    • 这似乎也不适用于直接构建的视图模型,即不使用映射插件制作的视图模型。看看这个小提琴:jsfiddle.net/82vsf/3 使用此处文档中的示例:knockoutjs.com/documentation/options-binding.html 只是它为可观察对象设置了一个初始值并且没有未选择的选项。
    • 我给 Ryan Niemeyer 发了电子邮件,看看他是否可以帮助将上述初始值绑定到 select。
    • select标签绑定的问题是ko.mapping插件生成的patriarch实例与allPeople中对应的实例不同。由于无法找到所选值的匹配项,因此默认为第一个。我们可以通过将 patriarch 值设置为来自 allPeople 的特定实例来解决此问题。这是一个示例:jsfiddle.net/SZXDG/11
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 1970-01-01
    • 1970-01-01
    • 2017-12-17
    • 1970-01-01
    • 2014-09-19
    相关资源
    最近更新 更多