// 这是一个通用的 发布订阅模块 //参考:https://gist.github.com/turtlemonvh/10686980/038e8b023f32b98325363513bf2a7245470eaf80 app.factory('pubSubService', ['$rootScope', function ($rootScope) { // private notification messages var _DATA_UPDATED_ = '_DATA_UPDATED_'; /* * @name: publish * @description: 消息发布者,只用$emit冒泡进行消息发布的低能耗无污染方法 * @param: {string=}: msg, 要发布的消息关键字,默认为'_DATA_UPDATED_'指数据更新 * @param: {object=}: data,随消息一起传送的数据,默认为空 * @example: * pubSubService.publish('config.itemAdded', {'id': getID()}); * 更一般的形式是: * pubSubService.publish(); */ var publish = function (msg, data) { msg = msg || _DATA_UPDATED_; data = data || {}; $rootScope.$emit(msg, data); }; /* * @name: subscribe * @description: 消息订阅者 * @param: {string=}: 消息关键字,默认为'_DATA_UPDATED_'指数据更新 * @param: {object=}: 控制器作用域,用以解绑定,默认为空 * @param: {function}: 回调函数,在订阅消息到来时执行 * @example: * pubSubService.subscribe('data_change', $scope, function(event, data) { * $scope.power = data.power; * $scope.mass = data.mass; * }); * 更一般的形式是: * pubSubService.subscribe(function(){}); */ var subscribe = function (msg, scope, func) { if (!angular.isFunction(func)) { console.log("pubSubService.subscribe need a callback function"); return; } msg = msg || _DATA_UPDATED_; var unbind = $rootScope.$on(msg, func); //可控的事件反绑定机制 if (scope) { scope.$on('$destroy', unbind); } }; // return the publicly accessible methods return { publish: publish, subscribe: subscribe }; }])