使用范围:子类.js给父类.js或者其他页面上.js传值
二话不说,先上代码
1、Notifications.js
angular.module('pr.services')
.provider('Notifications',
function() {
//https://github.com/trochette/Angular-Design-Patterns-Best-Practices/blob/master/js/base/EventDispatcher.js
var eventDispatcher = {
_listeners: {},
_cache: {},
event: {
// account: object
ACCOUNT_CHANGE: 'PR_ACCOUNT_CHANGE',
//Risk Measures
RISK_MEASURE_CHANGE: 'PR_RISK_MEASURE_CHANGE',
},
addEventListener: function(type, listener, cache) {
if (!this._listeners[type]) {
this._listeners[type] = [];
}
this._listeners[type].push(listener);
if (cache && this._cache.hasOwnProperty(type)) {
listener.apply(null, this._cache[type]);
}
},
removeEventListener: function(type, listener) {
if (this._listeners[type]) {
var index = this._listeners[type].indexOf(listener);
if (index !== -1) {
this._listeners[type].splice(index, 1);
}
}
},
dispatchEvent: function() {
var listeners;
var data = arguments;
var type = arguments[0];
if (typeof type !== 'string') {
console.warn('EventDispatcher', 'First params must be an event type (String)');
} else {
// console.log(data);
listeners = this._listeners[type];
this._cache[type] = data;
if (listeners) {
listeners.forEach(function(listener) {
listener.apply(null, data);
});
}
}
},
getLastCalledValue: function(type) {
return this._cache.hasOwnProperty(type) ? this._cache[type] : [];
}
};
eventDispatcher.notify = eventDispatcher.dispatchEvent;
this.$get = function() {
return eventDispatcher;
};
}
);
a. eventDispatcher.notify 函数 ----------- 当数据有改变的时候,通知riskMeasureHandler函数
使用:
Notifications.notify(Notifications.event.RISK_MEASURE_CHANGE,$scope.riskMeasureAll);
使用:
$scope.$on('$destroy', function() {
Notifications.removeEventListener(Notifications.event.RISK_MEASURE_CHANGE, riskMeasureHandler);
});
c.addEventListener函数 ----------------- 增加监听的地方,如果
notify 改变他的值就改变被改变,每次notify 每次都改变,立即改变。
使用:
var riskMeasureAllAfter;
var riskMeasureHandler = function(ev, riskMeasureAll) {
riskMeasureAllAfter = riskMeasureAll;
};
Notifications.addEventListener(Notifications.event.RISK_MEASURE_CHANGE, riskMeasureHandler, true);
$scope.$on('$destroy', function() {
Notifications.removeEventListener(Notifications.event.RISK_MEASURE_CHANGE, riskMeasureHandler);
});
d.RISK_MEASURE_CHANGE -------- 监听的事件名,唯一标识每一个事件。(在eventDispatcher 的 event 中定义)
定义:
RISK_MEASURE_CHANGE: 'PR_RISK_MEASURE_CHANGE',
使用:
Notifications.notify(Notifications.event.RISK_MEASURE_CHANGE,$scope.riskMeasureAll);
注意:
当值回传时:对象不只是值相同,而且应该是同一个对象,先用_.find 找到
$scope.riskMeasureBefore = _.find($scope.riskMeasures, {
name: st.getRiskMeasure()
});
if(!riskMeasureAllAfter){
$scope.riskMeasure = $scope.riskMeasureBefore;
}
else{
//have same data ,but not the same object
$scope.riskMeasure = _.find($scope.riskMeasures, {
name: riskMeasureAllAfter.changed.name
});
}