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

4

1 回答 1

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/

这可以按您的需要工作吗?

于 2012-12-16T07:02:50.443 回答