如何定义模块并在AMD的dojo中使用它?

Dev*_*she 5 dojo amd

我正在维护和扩展一个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;
});
Run Code Online (Sandbox Code Playgroud)

我已将此文件另存为 /customModules/singleChart.js

在我的主HTML页面中,我已将其添加到包中,如下所示:

var dojoConfig = { parseOnLoad: true,
        packages: [....,{"name":"customModules",
             "location":location.pathname.replace(/\/[^/]+$/, "")+"/modules" }
                         ]};
Run Code Online (Sandbox Code Playgroud)

我想称之为的功能是AMD之前的功能.所以我称之为:

dojo.require("customModules.singleChart");
.
.
.
customModules.singleChart.showDailyChart(data);
Run Code Online (Sandbox Code Playgroud)

我可以看到它/customModules/singleChart.js在Firebug控制台和Net Tab中加载.但是没有任何customModules.singleChart对象.奇怪的是,也没有错误.我在Firebug中测试了这个,以及谷歌Chrome的开发者工具.

使用AMD模块的正确方法是什么dojo.require?或者有更好的方法来做我需要的吗?

Phi*_*ppe 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
         }
    });
});
Run Code Online (Sandbox Code Playgroud)

declare函数的第二个参数是您继承的类或类列表,在这种情况下为null.

然后,您可以通过使用"new"关键字对其进行实例化来使用此小部件.

var foo = new customModules.singleChart();
foo.showDailyChart(data);
...
Run Code Online (Sandbox Code Playgroud)

如果你想要一个静态函数,你可以这样做:

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;
});
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

customModules.singleChart.showDailyChart(data);
Run Code Online (Sandbox Code Playgroud)

更多细节:http://dojotoolkit.org/reference-guide/1.9/dojo/_base/declare.html#signature