我想在div上放一个变量,并由此div下的所有dojo小部件应用和继承。
这可行吗?
例如
<div shaper="Contextual">
<textarea ..../>
<select multiple data-dojo-type="dijit/form/MultiSelect">
....
</div>
我希望整形器支持的功能应用于div中包含的所有小部件。 p。:&#34; shaper&#34;是一个自定义模块,用于对阿拉伯数字进行数字整形。
答案 0 :(得分:0)
这是可能的,但不是开箱即用。
你可以这样写:
require(["dojo/query", "dojo/domReady!"], function(query) {
query("[shaper]").forEach(function(shaper) {
});
});
这将查询具有shaper
属性的所有元素并循环遍历它。在循环内部,您必须检索shaper
属性的值(例如Contextual
),您可以使用getAttribute()
函数执行此操作,例如:
var shaperModule = shaper.getAttribute("shaper");
现在您有要加载的模块的名称,因此您可以在循环中编写类似的内容:
require([shaperModule], function(shaperModule) {
});
这将使用AMD来检索Contextual
模块。现在剩下的就是将shaper
功能包含在<div>
内的所有小部件中。
首先,使用dijit/registry::findWidgets()
可以检索特定DOM节点中的所有小部件,在这种情况下,您可以使用它来检索dijit/form/MultiSelect
小部件:
registry.findWidgets(shaper);
然后,您可以遍历找到的小部件数组,并使用dojo/_base/lang::mixin()
扩展具有另一个对象内容的对象,例如:
registry.findWidgets(shaper).forEach(function(widget) {
lang.mixin(widget, shaperModule);
});
例如:http://jsfiddle.net/zLv7cvzt/
虽然这可能不完全有用(如果模块不存在或者小部件中的小部件怎么办,dijit/registry::byId()
没有检测到),它确实可以让你知道如何实现它。
要回答你的第二个问题,如果可行或不可行,我会说这取决于。如果你用这样的另一个小部件扩展一个小部件,它实际上可能真的很奇怪,因为所有小部件都从提供小部件生命周期的dijit/_WidgetBase
扩展,你可以在它们的生命周期中混合两个小部件。
此外,如果您最终这样做并且出现错误,如果您不熟悉自定义代码,则很难对其进行调试。