Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/447.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Monkey用AMD(特别是Dijit/DialogUnderlay)修补Dijit小部件。可能的_Javascript_Requirejs_Dojo_Amd - Fatal编程技术网

Javascript Monkey用AMD(特别是Dijit/DialogUnderlay)修补Dijit小部件。可能的

Javascript Monkey用AMD(特别是Dijit/DialogUnderlay)修补Dijit小部件。可能的,javascript,requirejs,dojo,amd,Javascript,Requirejs,Dojo,Amd,我试图对dijit/Dialog的默认行为进行一个简单的更改。我希望在单击参考底图(背景)时关闭对话框 我在Dojo的前一个版本中做过一次,但我正在努力用新的AMD/requireJs风格来做 如果我在应用程序启动时加载dijit/DialogUnderlay模块,我可以对其进行修补,但我的更改似乎只影响我所需的实例,而不是所有实例。可能require()只提供一个副本 我需要扩展dijitDialog并使用我的子类吗?有没有一种更简单的方法来做我想做的事?我认为它的一般形式是这样的: requ

我试图对dijit/Dialog的默认行为进行一个简单的更改。我希望在单击参考底图(背景)时关闭对话框

我在Dojo的前一个版本中做过一次,但我正在努力用新的AMD/requireJs风格来做

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


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

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

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;
});
require(['mypatchedlib'], function(mylib) {
    // use the patched lib
});
然后,无论您想在哪里使用lib,都可以执行以下操作:

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;
});
require(['mypatchedlib'], function(mylib) {
    // use the patched lib
});
RequireJS中还有一个允许您将特定require的所有使用重定向到新版本,以便当其他库请求mylib时,您自动重定向它们以使用修补版本

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

您可以使用事件委派并保持对话框不变。下面是一个实现您所描述内容的示例。只需在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等文件中):

有关其他选项,请参阅的文档