来自命名空间的Javascript回调

时间:2013-05-11 12:08:56

标签: javascript

我有这样的命名空间设置:

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

2 个答案:

答案 0 :(得分:2)

您可以测试是否存在回调并运行该函数(如果存在):

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

答案 1 :(得分: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');
});

<强> working jsFiddle

<强> working jsFiddle with event objects

你可能需要稍微调整一下数组的检查,我不知道如何完美地完成它。