能.控件.默认值和选项合并
can.Control.defaults and options merging
使用可以.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 似乎没有正确合并嵌套对象。是这样吗?有没有人有任何聪明的想法,我如何在不分叉的情况下支持此功能?还是我错过了一些明显的东西?如果我能做到这一点,这将节省我编写大量费力的选项创建代码。
正如@tikider指出的,can.extend
使用原生的 .extend 库(在大多数情况下可能是$.extend
),默认情况下不执行深度克隆。但是,您应该能够覆盖控件设置并进行深度扩展:
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);
}
});
相关文章:
- JQuery合并了keyup和focusout两个函数
- 我的单元测试选项是什么
- 如何更改bigquery API中的计费层选项
- 使用Javascript获取所选选项ID
- Selectize.js:如何对整数值的选项进行排序
- 通过js在新选项卡中有条件地打开url
- 按照选项卡索引的顺序循环一个jQuery选择
- 如何在使用selectBoxIt JQuery插件时检测选项更改
- JSON重构(合并内容)与javascript
- 无法在Ionic select中预先选择最后一个选项
- 如何在选项卡上定义属性'的主窗口对象
- 为什么grunt contrib connect的中间件选项的第三个参数是未定义的
- I10n.js's到LocaleString(opts)合并选项
- compressjs.sh 选项仅合并不缩小
- 能.控件.默认值和选项合并
- 选项的意义=合并({},options)语句
- 用递归合并选项javascript对象
- 如何合并电子表格并在新文档中设置其选项卡顺序
- 将“enter”选项合并到“update”选项中
- 如何合并原型对象中的默认选项