1

dijit/Dialogのデフォルトの動作に簡単な変更を加えようとしています。アンダーレイ(背景)をクリックしたときにダイアログを閉じたい。

私はこれを以前のDojoの化身で一度行いましたが、新しいAMD/requireJsスタイルでそれを行うのに苦労しています。

アプリケーションの起動時にdijit/DialogUnderlayモジュールをロードすると、モンキーパッチを適用できますが、変更は必要なインスタンスにのみ影響し、すべてのインスタンスには影響しないようです。おそらくrequire()はコピーのみを提供します。

dijitDialogを拡張して、子クラスを使用する必要がありますか?私がやりたいことをするもっと簡単な方法はありますか?

4

2 に答える 2

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には、特定のrequireのすべての使用を新しいバージョンにリダイレクトできるマップ構成もあります。これにより、someotherlibがmylibを要求すると、パッチが適用されたバージョンを使用するように自動的にリダイレクトされます。

map: {
    'someotherlib': { 'mylib': 'mypatchedlib' }
}
于 2013-03-25T14:26:31.033 に答える
1

イベントの委任を使用して、ダイアログをそのままにしておくことができます。これがあなたが説明することを達成するための例です。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のドキュメントを参照してください...

于 2013-03-25T14:39:08.447 に答える