my-bookmark/view/scripts/services/pub-sub-service.js

54 lines
1.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

// 这是一个通用的 发布订阅模块
//参考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
};
}])