2012-12-16 83 views
0

我想使用knockout贴图插件,但我需要模型中的对象作为属性(主要是因为它们需要可替换)。Knockout Mapping插件 - 将对象映射到可观察对象

考虑一个大大简化例如以下模型:

{ 
    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

这个怎么样?对于选择:

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

和设置最多时的映射,而不是指定的族长属性的子视图模型,使用初始数据返回可观察到的:这里

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/

这是否正常工作?

+0

'vm.family.patriarch'的值被设置为'allPeople'中的第一个对象。例如,如果将'data.family.patriarch.name'的值更改为“Wilma Flintstone”,则“Fred Flinstone”仍将出现在警报框中。 –

+0

如果添加“alert(ko.toJSON(options.data))”;“到create方法中,您可以看到它默认正确数据的可见性,但显然,select的绑定并不完全正确,因为订阅触发了立即显示基础选定值已重置为第一个条目的情况。但后续更改会正确更改observable的值。我会去排序选择绑定。 –

+0

这似乎也不适用于直接构建的视图模型,即没有使用映射插件创建的视图模型。看看这个小提琴:http://jsfiddle.net/82vsf/3/这是使用文档中的例子:http://knockoutjs.com/documentation/options-binding.html,除了它是设置一个初始值对于可观察的并且没有未被选择的选项。 –

相关问题