Javascript JS观察者模式

Javascript JS观察者模式,javascript,observer-pattern,Javascript,Observer Pattern,我尝试了观察者模式(通过这两个URL:,),但是当我调用发布函数时,侦听器数组是空的 main.pagination.event= (function () { var listeners = []; return { subscribe: function (fn) { listeners.push(fn); return { unsubscribe: function (fn

我尝试了观察者模式(通过这两个URL:,),但是当我调用发布函数时,侦听器数组是空的

main.pagination.event= (function () {
    var listeners = [];   
    return {
        subscribe: function (fn) {
            listeners.push(fn);
            return {
                unsubscribe: function (fn) {
                    listeners= listeners.filter(
                        function (item) {
                            if (item !== fn) {
                                return item;
                            }
                        }
                    );
                }
            };
        },
        publish: function () {
            //it's empty
            listeners.forEach(function (item) {
                item("...");
            });
        }
    };
})();
main.pagination.init = function () {
   $('ul li').click(function () {
      main.pagination.event.publish();
   };
};

main.update.init = function() {
    var event = main.pagination.event.subscribe(main.update.listener);
};

main.update.listener = function (tbl) {
   alert(tbl);
};

谢谢您的帮助。

它是空的,因为您在
发布
之后调用
订阅
,而
侦听器
数组中不包含任何内容。就这样改变通话顺序

main.update.listener = function (tbl) {
    alert(tbl);
};
main.pagination.init = function () {
    $('ul li').click(function () {
        main.pagination.event.publish();
    };
};

main.update.init = function() {
    var event = main.pagination.event.subscribe(main.update.listener);
};

main.update.init(); // invoke subscribe first to add the listener to the array
main.pagination.init();

谢谢你,很抱歉,我的问题不够精确。请检查我的编辑,仍然大致相同,只需确保首先定义了你的侦听器,然后调用
subscribe
在调用
publish
之前添加侦听器。侦听器函数位于对话框A上。当我单击对话框A上的按钮时,它将打开对话框B,其中显示观察者模式。当dialog B加载dialog A订阅lisener时(此操作有效),当我单击dialog B上的按钮时,它将启动发布函数,但侦听器数组为空。我想这些顺序是对的。谢谢你的帮助,这对我很有帮助。对话框B导致了我的问题,因为它在加载时重新创建了整个javascript对象并删除了旧对象。我将观察者模式放到对话框A中,现在它可以工作了。谢谢。