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