Knockout Mapping插件 - 将对象映射到observables

时间:2012-12-16 03:34:42

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

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

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

{
  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行代码,但由于映射插件功能如此全面,我希望有一个选项或其他方法可以使这个看似常见的场景工作。

1 个答案:

答案 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/

这是否可以根据您的需要进行操作?