如何查找dojo模块的模块ID

如何查找dojo模块的模块ID,dojo,amd,Dojo,Amd,我有一组全局javascript页面资源,需要从许多不同的dojo类管理这些资源。在旧版本(dojo 1.6)中,我使用类实例的declaredClass属性来确定哪个类参与访问共享资源并采取适当的行动 现在我正在使用AMD加载器,并且已经适当地转换了我的模块,这项技术不再有效。事实上,似乎无法确定类实例在运行时的模块ID是什么。我已经浏览了dojo 1.9dojo\\u base\declarecode,但似乎只有在通过c3mro函数存在公共基类时才分配唯一标识符 这里有两个例子,与旧版本的d

我有一组全局javascript页面资源,需要从许多不同的dojo类管理这些资源。在旧版本(dojo 1.6)中,我使用类实例的
declaredClass
属性来确定哪个类参与访问共享资源并采取适当的行动

现在我正在使用AMD加载器,并且已经适当地转换了我的模块,这项技术不再有效。事实上,似乎无法确定类实例在运行时的模块ID是什么。我已经浏览了dojo 1.9
dojo\\u base\declare
code,但似乎只有在通过
c3mro
函数存在公共基类时才分配唯一标识符

这里有两个例子,与旧版本的dojo相比,
declaredClass
函数的运行方式似乎有悖直觉

案例1:具有共享基类的两个类

Base.js

define([“dojo/_base/declare”],函数(declare){
返回declare(null,{
});
});
ClassA.jsClassB.js

define([“dojo/_base/declare”,“/_base”],函数(declare,_base){
返回声明([\u Base]{
});
});
测试脚本

uniqName_1
uniqName_1
undefined
undefined
require([“myapp/test/ClassA”,“myapp/test/ClassB”],函数(A,B){
var a=新的a();
var b=新的b();
控制台日志(a.declaredClass);
控制台日志(b.declaredClass);
});
输出

uniqName_1
uniqName_1
undefined
undefined
如果我更改了测试,使
ClassA
ClassB
不从
\u Base
继承,或者通过将
\u Base
作为单个参数而不是数组传递来使用简单继承,那么我将获得输出的
未定义的

ClassA.jsClassB.js

define([“dojo/_base/declare”,“/_base”],函数(declare,_base){
返回declare(null{
});
});

define([“dojo/_base/declare”,“/_base”],函数(declare,_base){
返回declare(_Base{
});
});
测试输出

uniqName_1
uniqName_1
undefined
undefined
我可以通过显式设置
declare()
函数的
className
参数来解决这个问题,但是为了编写可移植模块,这显然是不可取的

那么,是否有任何方法可以从类实例中知道用于实例化该类的模块ID

更新

我试图支持的用例是
\u Base
类,它可以通过中介访问一些全局资源。下面是1.7版本之前的逻辑的框架。显然,我可以创建一种不同的方法来识别资源的用户,但我很好奇是否有办法将1.7之前的行为适应AMD基础设施

Base.js

define([“dojo/_-base/declare”,“dojo/_-base/kernel”],函数(declare,kernel){
返回declare(null{
激活:功能(项目){
//获取当前活动项的集合
var activeItems=kernel.global.activeItems | |{};
//禁用当前处于活动状态的任何内容,除非是针对
//当前实例
for(activeItems中的var键){
if(key!==此.declaredClass){
activeItems[key]。停用();
}
}
//激活并保存当前项目
item.activate();
activeItems[this.declaredClass]=项目;
kernel.global.activeItems=activeItems;
},
停用:功能(项目){
var activeItems=kernel.global.activeItems | |{};
if(activeItems[this.declaredClass]){
item.deactivate();
删除活动项[this.declaredClass];
}
}      
});
});

实际上,唯一可能的方法是使用
declare()
参数。我不知道你想要实现什么,但我认为这是一个很好的方法。如果重命名模块,则使用
declaredClass
的代码仍然有效

此外,Dojo允许您自定义包,并选择应使用的包名称以及该包的路径。因此,这意味着您可以同时拥有
myPackage/ClassA
,但您也可以对包进行命名,从而获得
myExtremelyCoolPackage/ClassA
。如果没有静态类名,那么使用该类名的代码实际上会中断

除此之外,类名在AMD中几乎是不必要的,您不需要它们来加载模块或声明性标记。它们存在的唯一原因是支持仍然依赖类名的遗留代码。因此,如果您真的不想将它放在
declare()
中,那么说明您想在什么用例中使用它可能会很有用