我想将一个变量放在div上,并由该div下的所有dojo小部件应用和继承。
这可行吗?
例如
<div shaper="Contextual">
<textarea ..../>
<select multiple data-dojo-type="dijit/form/MultiSelect">
....
</div>
我希望shaper支持的功能应用于div中包含的所有小部件。附注:"shaper“是一个自定义模块,用于对阿拉伯数字进行数字整形。
发布于 2015-03-02 13:59:45
这是可能的,但不是开箱即用的。
你可以这样写:
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
扩展而来的,您可以混合这两个小部件的生命周期。
此外,如果您最终执行此操作并收到错误,如果您不熟悉自定义代码,则将很难对其进行调试。
https://stackoverflow.com/questions/28806631
复制相似问题