使用AMD(特别是dijit / DialogUnderlay)修补Dijit Widget。可能?

时间:2013-03-25 13:42:00

标签: javascript requirejs dojo amd

我正在尝试对dijit / Dialog的默认行为进行简单的更改。我希望在单击底衬(背景)时关闭对话框。

我曾经在Dojo的前一个版本上做过一次,但是我很难用新的AMD / requireJs风格来做这件事。

如果我在应用程序启动时加载dijit / DialogUnderlay模块,我可以修补它,但我的更改似乎只影响我需要的实例,而不是所有实例。推测require()只提供副本。

我是否需要扩展dijitDialog并使用我的子类?有没有更简单的方法来做我想要的事情?

2 个答案:

答案 0 :(得分:1)

我认为它的一般形式是这样的:

require.config({
    paths: {
        'mylib': 'libs/mylib-x.y.x/mylib'
    }
});

define('mypatchedlib', ['mylib'], function (mylib) {

    // do your monkey patching here

    // and then return the patched version
    return mylib;
});

然后你想在任何地方使用lib,你可以这样做:

require(['mypatchedlib'], function(mylib) {
    // use the patched lib
});

RequireJS中还有一个map config,允许您将特定需求的所有使用重定向到新版本,这样当someotherlib请求mylib时,您会自动重定向它们以使用修补版本。

map: {
    'someotherlib': { 'mylib': 'mypatchedlib' }
}

答案 1 :(得分:1)

您可以使用事件委派并保持Dialog不变。这是一个实现你所描述的例子。只需在您的HTML中输入并运行以下内容:

require(["dojo/_base/window", "dijit/Dialog", "dojo/on", "dijit/form/Button"],
function(win, Dialog, on, Button){
    var dialogInstance = new Dialog({
        innerHTML : "Hello world !"
    });

    on(win.body(), "._underlay:click", function(evt){
       dialogInstance.hide();
    });

    var btn = new Button({ 
        label : "Show Dialog",
        onClick : function(evt) {
             dialogInstance.show();   
        }
    },"btn1");
});

但是,如果您仍想扩展dijit / Dialog,则可以执行以下操作(例如,在MyDialog.js等文件中):

define(["dojo/_base/declare", "dijit/DialogUnderlay"], 
function(declare, DialogUnderlay) {

    return declare(DialogUnderlay, {
        myCustomDialogProperty : foo
        // other customizations [...]
    });

});

有关其他选项,请参阅dojo/_base/declare的文档......