【问题标题】:Knockout Mapping an array but not its child properties?Knockout 映射一个数组而不是它的子属性?
【发布时间】:2013-03-14 17:44:39
【问题描述】:
我正在尝试使用淘汰赛映射插件,除了一个部分外,我的工作正常。
我有一个对象数组,我希望数组是可观察的,但我不希望数组中的对象此时是可观察的。
例如:
主要
标签
窗口
我希望所有的 Window 属性都不可观察,但我希望 Windows 数组是。
谁能给我一些关于如何做到这一点的提示?
【问题讨论】:
标签:
knockout.js
knockout-mapping-plugin
【解决方案1】:
mapping plugin 具有复制选项,该选项创建 JS 属性,其值被复制过来(即,我认为您不能将 'Window.Title' 作为顶级视图模型的属性映射,尽管随意试试看!),这听起来像你所追求的。但是,由于它是一个孩子,我不确定它是否会起作用,所以您可能想查看创建映射,您可以在其中完全控制映射,您可以直接将窗口数据对象复制到 Windows 数组中,否则也使用映射插件,并在其上使用复制映射。
【解决方案2】:
这是我想出的答案:
var Main = function() {
return { ....}
}();
var mainMap = {
'Tabs':{
create:function(options){
return new Tab(options.data);
}
}
};
function Tab(data){
var defaults = { ...}
data = $.extend(true, defaults, data);
var tabMap = {
'copy': ['id'],
key: function(data) {
return ko.utils.unwrapObservable(data.id);
},
'windows': {
create: function(options) {
return new myWindow(options.data);
}
}
};
ko.mapping.fromJs(data, tabMap, this);
}
function myWindow(data){
var defaults = { ....};
return $.extend(true, defaults, data);
}
ko.mapping.fromJS(data, mainMap, Main);
ko.applyBindings(Main, $('#Main')[0]);