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

时间:2013-06-25 05:22:57

标签: 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;
});

我已将此文件另存为/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模块的正确方法是什么?或者有更好的方法来做我需要的事情吗?

3 个答案:

答案 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本身。