使用can.js我有这个控件:
var Test_Controller = can.Control({
defaults: {
option1: 'option1',
option2: 'option2',
option3: {
nested1: 'nested1',
nested2: 'nested2',
nested3: 'nested3'
}
}
}, {
init: function() {
if ($(this.element).attr('data-newtext')) {
this.options.option3.nested2 = $(this.element).data('newtext');
}
$(this.element).text(this.options.option3.nested2);
}
});
..和这个标记:
<div class="instance1" data-newtext="newtext"></div>
<div class="instance2"></div>
..然后,如果我像这样创建该控件的实例:
var instance1 = new Test_Controller('.instance1', {});
var instance2 = new Test_Controller('.instance2', {});
我希望看到的是2个div,其中一个插入newtext
,另一个插入nested2
,但我实际看到的是2个带有newtext
的div插入。
如果我更改我的选项对象以使其不使用嵌套,但将所有选项放在顶层,那么我没有问题。
因此,当使用默认值合并选项时,似乎canJS无法正确合并嵌套对象。是这样的吗?有没有人有任何聪明的想法我怎么能够支持这个功能而不用分叉?还是我错过了一些明显的东西?如果我能做到这一点,那么我将不得不编写大量费力的选项创建代码。
答案 0 :(得分:1)
正如@tikider所指出的那样,can.extend
使用本机.extend库(在大多数情况下可能是$.extend
),默认情况下不会进行深度克隆。但是,您应该能够覆盖控件setup并进行深度扩展:
var Test_Controller = can.Control({
defaults: {
option1: 'option1',
option2: 'option2',
option3: {
nested1: 'nested1',
nested2: 'nested2',
nested3: 'nested3'
}
}
}, {
setup: function( element, options ) {
var allOptions = $.extend(true, {}, this.constructor.defaults, options);
return can.Control.prototype.setup.call(this, element, allOptions);
},
init: function() {
if (this.element.attr('data-newtext')) {
this.options.option3.nested2 = this.element.data('newtext');
}
this.element.text(this.options.option3.nested2);
}
});