我正在维护和扩展一个AMD之前的旧项目。 我想在应用程序中添加一个图表。为此,我创建了一个js文件,如下所示:
define(["dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"],
function (Chart) {
function showDailyChart(data){
//code to show the chart in a dialog
}
return customModules.singleChart;
});
我已将此文件另存为/customModules/singleChart.js
在我的主HTML页面中,我已将其添加到包中,如下所示:
var dojoConfig = { parseOnLoad: true,
packages: [....,{"name":"customModules",
"location":location.pathname.replace(/\/[^/]+$/, "")+"/modules" }
]};
我想称之为的功能是AMD之前的功能。所以我称之为:
dojo.require("customModules.singleChart");
.
.
.
customModules.singleChart.showDailyChart(data);
我可以看到/customModules/singleChart.js
已加载到Firebug控制台和Net Tab中。但是没有customModules.singleChart
个对象。奇怪的是,也没有错误。我在Firebug中测试了这个,以及谷歌Chrome的开发者工具。
使用dojo.require
调用AMD模块的正确方法是什么?或者有更好的方法来做我需要的事情吗?
答案 0 :(得分:7)
要使用具有pre-AMD代码的窗口小部件,您需要使用dojo / _base / define声明模块,并将define函数的第一个参数设置为点表示法中的模块ID,如下所示:
define(["dojo/_base/declare","dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (declare, Chart){
return declare("customModules.singleChart", null, {
showDailyChart: function(data){
//code to show the chart in a dialog
}
});
});
declare函数的第二个参数是您继承的类或类列表,在这种情况下为null。
然后,您可以使用" new"来实例化它。关键字。
var foo = new customModules.singleChart();
foo.showDailyChart(data);
...
如果你想要一个静态函数,你可以这样做:
define(["dojo/_base/declare","dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (declare, Chart){
var widget = declare("customModules.singleChart", null, {
});
widget.showDailyChart = function(data){
//code to show the chart in a dialog
}
return widget;
});
然后您可以像这样使用它:
customModules.singleChart.showDailyChart(data);
此处有更多详情:http://dojotoolkit.org/reference-guide/1.9/dojo/_base/declare.html#signature
答案 1 :(得分:1)
我不确定,但我认为你需要创建一个showDailyChart
属性的对象。
这样的事情可能有用:
define(["dojox/charting/Chart",...."dijit/Dialog","dojo/dom-construct"], function (Chart) {
return {
showDailyChart: function(data){
//code to show the chart in a dialog
}
}
});
通常,您应该可以通过以下方式使用您的模块:
require(["myPackage/myModule"], function(myModule) {
myModule.showDailyChart(myData);
});
或使用遗留代码(提醒它将在2.0中消失)。
dojo.require("myPackage.myModule");
myPackage.myModule.showDailyChart(myData);
答案 2 :(得分:1)
dojo/_base/loader
模块是负责处理Dojo 1.7+中的dojo.require
调用的模块。当您使用旧版dojo.require
方法加载AMD模块时,如果config-publishRequireResult
has-rule是真实的(默认情况下是这样),那么AMD模块返回的对象将自动使用只要在那里没有对象,就在dojo.require
调用中提供对象名称。从Dojo 1.9源代码loader.js:669-672
:
var result = doRequire(moduleName, omitModuleCheck);
if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){
lang.setObject(moduleName, result);
}
如果因为其中一个条件不成立而无效,您可以自己使用dojo/_base/lang.setObject
手动设置对象。使用Philippe建议的dojo/_base/declare
的三参数版本只需dojo/_base/declare
调用setObject
本身。