2013-03-25 37 views
1

我正在尝试对dijit/Dialog的默认行为进行简单的更改。我希望当底纹(背景)被点击时关闭对话框。猴子用AMD修补Dijit Widget(特别是dijit/DialogUnderlay)。可能?

我曾经在Dojo的前身化身上做过这件事,但是我正努力用新的AMD/requireJs风格去做。

如果我在应用程序启动时加载dijit/DialogUnderlay模块,我可以对其进行修补,但是我的更改似乎只影响我所需的实例,而不是所有实例。大概要求()只提供一个副本。

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

回答

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 
}); 

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

map: { 
    'someotherlib': { 'mylib': 'mypatchedlib' } 
} 
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 /对话框,你可以做以下(在一个文件中,如MyDialog.js如):

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

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

}); 

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