5

我正在维护和扩展 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 以及 Google Chrome 的开发者工具中对此进行了测试。

使用 调用 AMD 模块的正确方法是什么dojo.require?还是有更好的方法来做我需要的事情?

4

3 回答 3

7

要将您的小部件与 pre-AMD 代码一起使用,您需要使用 dojo/_base/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

于 2013-06-25T16:18:14.953 回答
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);
于 2013-06-25T06:49:36.897 回答
1

dojo/_base/loader模块负责处理dojo.requireDojo 1.7+ 中的调用。当您使用 legacy 方法加载 AMD 模块时dojo.require,如果config-publishRequireResulthas-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本身。

于 2013-06-26T03:16:02.690 回答