我正在几个不同的小部件中加载一个实用程序模块。这个模块只包含一堆像这样的DOM事件:
openPointPicker: function() {
fx.animateProperty({
node:"point-picker",
properties: {
top: { end: 60, start:-500 }
}
}).play();
domClass.add("point-picker", "menu-open");
},
closePointPicker: function() {
fx.animateProperty({
node:"point-picker",
properties: {
top: { end: -500, start:60 }
}
}).play();
domClass.remove("point-picker", "menu-open");
},
我在我的应用程序中使用它,它总是加载得很好。除一例外。我有一个需要使用它的小部件,所以我创建了它:
define([
"dojo/_base/declare",
"dijit/_WidgetBase",
"dijit/_TemplatedMixin",
"dojo/text!./templates/PMS.html",
"dojo/dom-construct",
"app/menus", //this loads in plenty of other widgets and files, but not here
"dojo/domReady!"
],
function(declare, _WidgetBase, _TemplatedMixin, template, domConstruct, menus) {
return declare("PMS",[_WidgetBase, _TemplatedMixin], {
templateString: template,
widgetsInTemplate: true,
symbol:null,
layer:null,
constructor: function() {
console.log(menus); //empty object
},
postMixInProperties: function() {
},
postCreate: function() {
},
chooseLocation: function() {
menus.openPointPicker();
var handle = topic.subscribe('location-picked', function(locationInfo) {
//stuff
handle.remove();
});
}
}
);
});
当尝试触发'chooseLocation'方法时,它调用menus.openPointPicker();那失败了:
Uncaught TypeError: Object #<Object> has no method 'openPointPicker'
现在,我能做的是特别要求“app / menus”这样:
chooseLocation: function() {
require(["app/menus"], function(menus) {
menus.openPointPicker();
var handle = topic.subscribe('location-picked', function(locationInfo) {
// some other stuff
handle.remove();
});
});
}
但为什么这是必要的?我不需要在使用此模块的任何其他小部件中执行此操作。我很困惑。
编辑:情节肯定会变厚。我将menus.js模块复制到menus2.js。我在我的模块列表中更改了它以加载。现在加载就好了。我显然不能有2个文件做同样的事情,但看起来这不是我做错了。看起来像Dojo AMD加载器中的某种错误。最终编辑:看起来我的menus.js模块中有一个循环引用。我的menus2.js测试文件中有相同的引用,所以我不知道为什么会这样。但无论如何,它都被重构了。