有没有办法检测是否存在自定义模块?

时间:2016-06-10 19:19:18

标签: javascript dojo

Dojo 1.10 +

我想根据这篇文章有条件地加载自定义模块

Dojo FAQ: How can I conditionally load AMD modules?

require([
    'dojo/has'
], function (has) {
    var ui;
    var moduleId = 'myApp/ui/';

    // Assume 'has' tests for mobile and tablet
    // have been defined
    if (has('mobile')) {
        moduleId += 'Mobile';
    }
    else if (has('tablet')) {
        moduleId += 'Tablet';
    }
    else {
        moduleId += 'Desktop';
    }

    require([moduleId], function (UiModule) {
        ui = new UiModule();
        ui.placeAt(document.body);
        ui.startup();
    });
});

然而似乎dojo /只检测到某些dojo功能。如果是这种情况,是否有另一种方法可以在尝试要求之前检测自定义模块是否存在,然后在其小部件中实例化它?

1 个答案:

答案 0 :(得分:1)

是的,dojo/has仅检测某些道场功能。但你可以添加自己的,我正在尝试像你在这里尝试的东西,也许不是最好的,但这对我有用。

在您的应用启动时,您可以将自己的功能添加到dojo,即

var deviceWidth = has('device-width'), hasTouch = has('touch');

has.add('mobile', (hasTouch && deviceWidth <=736));

has.add('tablet', (hasTouch && (deviceWidth > 736 && deviceWidth <=1024)));

等等,所以,稍后在另一个小部件中,您可以要求dojo/has并使用最近添加的功能。或者事件更好,你可以这样做

require(['dojo/has!mobile?myApp/ui/Mobile:myApp/ui/Tablet'], function (UiModule) {
    ui = new UiModule();
    ui.placeAt(document.body);
    ui.startup();
});

我从来没有尝试嵌套dojo/has验证,我无法告诉你它是否有效,但我已经尝试过,就像我给你的那个例子一样。

认为您可以在项目中拥有自己的has lib,扩展dojo版本并添加所需的所有功能。例如:

//myApp/has.js
define(["dojo/has"], function(has){
    has.add('myApp', true);

    return has;
});.

稍后在您的应用中,您可以加入myApp/has和我们,就像它是dojo版本一样。