2

次のような名前空間のセットアップがあります。

var myApp = {};
(function(context) {
    var id = 0;

    context.next = function() {
        return id++;
    };

    context.reset = function() {
        id = 0;
    }
})(myApp);
window.console && console.log(
    myApp.next(),
    myApp.next(),
    myApp.reset(),
    myApp.next()
) //0, 1, undefined, 0

名前空間の外でキャッチできる myApp からのコールバックが必要になりました。

名前空間の設定でそれを設定する方法はありますか?

たとえば、次のようなものです。

myApp.setCallback('next', function() {
    alert('hello');
 });
4

2 に答える 2

3

コールバックの存在をテストし、存在する場合は関数を実行できます。

var myApp = {};

(function(context) {
    var id = 0;

    context.next = function() {
        return id++;
    };

    context.reset = function() {
        id = 0;

        if(typeof this.onreset === 'function') {
            this.onreset();
        }
    }
})(myApp);


myApp.onreset = function() {};
于 2013-05-11T12:20:27.297 に答える
1

コールバック関数とそれらを登録する関数を含むオブジェクトを追加する必要があります。

var myApp = {};
(function(context) {
    var id = 0;

    var callbacks = {};

    context.next = function() {
        id++;
        doCallbacks('next');
        return id;
    };

    context.setCallback = function(event, f) {
        if(!callbacks[event] || !callbacks[event] instanceof Array) {
            callbacks[event] = [];
        }
        callbacks[event].push(f);
    }

    context.reset = function() {
        id = 0;
    }

    function doCallbacks(key /*, event */) {
        if(callbacks[key] && callbacks[key] instanceof Array) {
            for(var i=0; i < callbacks[key].length; i++) {
                callbacks[key][i](/*event*/);
            }
        }
    }
})(myApp);

そして、あなたは呼び出すことができます:

myApp.setCallback('next', function() {
    alert('hello');
});

作業中のjsFiddle

イベントオブジェクトでjsFiddleを操作する

配列のチェックを少し調整する必要があるかもしれませんが、完全に行う方法はわかりません。

于 2013-05-11T12:26:52.037 に答える