1

我知道论坛上有很多关于这个主题的问题,但我仍然找不到答案......

我有基于 jQuery 的 JS 应用程序。现在我必须对一些基于 Dojo 的小部件进行一些集成。我想仅在必要时加载 Dojo 和小部件,因此希望异步执行此操作。我将 Dojo 存储在我的站点上,因此请从我的空间加载它。

这是我尝试在 jQuery 中使用的代码:

$.getScript("/Content/3rd/dojo/dojo/dojo.js")
.done(function (script, textStatus) {
    dojo.ready(function () {
        dojo.require("dojo.io.script");

        alert('Dojo ready!')
    });
})
.fail(function (jqxhr, settings, exception) {
    alert('error!');
});

当我尝试调用dojo.require("dojo.io.script");异步请求所需的调用时,我的问题从一开始就开始了,我看到它尝试从以下 Url 加载 dojo.io.script - '/Example/io/script.js' 而这并不完全是它所在的地方。我怀疑我错过了一些配置问题,但不明白是哪一个......有人可以帮我解决它吗?

也许这是一个微不足道的问题,但我从未使用过 Dojo,只需要与基于 Dojo 的小部件进行快速集成,我的主要应用程序是 jQuery ......

解决方案:

以防万一有人感兴趣,我使用下一个脚本来加载小部件:

//  Load Dojo and scripts for JSDraw2 asyncronously
dojoConfig = {
    baseUrl: "/Content/3rd/dojo-1.8.3/dojo"
};

$.getScript("/Content/3rd/dojo-1.8.3/dojo/dojo.js")
.done(function (script, textStatus) {
    dojo.ready(function () {
        dojo.require("dojo.io.script");

        var deferred = dojo.io.script.get({ url: "/Content/3rd/JSDraw2.1.4/JSDraw2.js" });
        deferred.then(function () {
            // init the Dojo widget... 
            oThis.jsDraw = new JSDraw(oThis.element.get(0));
        }, function () {
            alert('Cannot load Scilligence.JSDraw2.js');
        });
    });
})
.fail(function (jqxhr, settings, exception) {
    alert('Cannot load Dojo.js');
});
4

1 回答 1

1

使用 Dojo 需要一个配置,这需要在 dojo.js 脚本被拉入之前加载。

Dojo 文档建议将配置放入您的索引文件(或等效文件)头中,但我想您可以在下拉 dojo 代码之前创建它,特别是如果您知道何时需要它。

因此,也许在您引入 dojo.js 之前尝试创建一个名为“dojoConfig”的全局变量。这是我不久前在 Web 应用程序上使用的示例配置,但阅读它也会对您有所帮助,以便更全面地了解它的原因和用途,以及 dojo 的用途和时间。我建议至少阅读dojo starthello dojo教程,然后阅读基于配置小部件的教程。您可能还想了解 dojo 如何使用AMD 原则

<script>
    var dojoConfig = {
        baseUrl: "./",//this is where dojo will lok from for all locations configured
        async: true,
        isDebug: false,
        parseOnLoad: false,//false to allow for us to call this independently in js later on

        //here are the packages dojo will be aware of and related js files
        packages: [
            //dojo specific packages
            {name: "dojo", location: "libs/dojo/1.8.1/dojo", main: "dojo.js.uncompressed.js"}, //dojo.js.uncompressed.js for dev, use dojo.js for release
            {name: "dijit", location: "libs/dojo/1.8.1/dijit"},
            {name: "dojox", location: "libs/dojo/1.8.1/dojox", main: "dojo.js"}
        ]
    };
</script>

我的配置包括 dojox 和 dijit,但当然,如果您不需要它们,那么只需删除这些行。尽管您确实提到了 dojo 小部件,但 dijit 是 dojo 获得“小部件功能”的地方。

您需要更改配置的基本 url 以反映您自己的 dojo 位置,同样适用于这些位置。有关此属性和其他属性的更多详细信息,请查看dojo 配置教程

抱歉上面有很多链接,虽然 dojo 1.8 是一个优秀的框架,尤其是在使用模块时,它需要一个学习曲线才能开始按照你的意图使用它。我以前从来没有尝试过像那样在游戏后期加载道场,所以我很想听听你是怎么做到的。

总之祝你好运。

于 2013-01-11T21:58:18.447 回答