gpt4 book ai didi

javascript - can.Control.defaults 和选项合并

转载 作者:行者123 更新时间:2023-11-28 01:57:43 25 4
gpt4 key购买 nike

使用 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 个 div,其中插入了已插入单词 newtext

如果我更改我的选项对象,使其不使用嵌套,而是将所有选项放在顶层,那么我就没有问题。

因此,在将选项与默认值合并时,canJS 似乎无法正确合并嵌套对象。是这样吗?有谁有什么聪明的想法,我如何能够在不 fork 的情况下支持此功能?或者我错过了一些明显的东西?如果我能做到这一点,我就不必编写大量费力的选项创建代码。

最佳答案

正如 @tikider 指出的,can.extend 使用 native .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);
}
});

关于javascript - can.Control.defaults 和选项合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18867885/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com