// 全局对象pubsub,具备发布主题、订阅、取消订阅的功能
var pubsub = {};
(function(myObject) {
// 存储广播主题
var topics = {};
// A topic identifier
var subUid = -1;
// Publish方法,传入主题名称,和主题需要传递的参数
myObject.publish = function( topic, args ) {
if ( !topics[topic] ) {
return false;
}
// 某个主题下的订阅者列举、统计
var subscribers = topics[topic],
len = subscribers ? subscribers.length : 0;
while (len--) {
// 依次执行订阅者队列的订阅者的func方法
subscribers[len].func( topic, args );
}
return this;
};
// Subscribe方法,用于往某个主题topic队列里添加订阅者, 每个订阅者会被保存为一个对象
// 该对象包括一个uid和该订阅者自定义的函数
// @return 返回token
myObject.subscribe = function( topic, func ) {
if (!topics[topic]) {
// 检测某个主题是否存在
// 不存在则新建空数组,用于存储观察者对象
topics[topic] = [];
}
var token = ( ++subUid ).toString();
topics[topic].push({
token: token,
func: func
});
return token;
};
// Unsubscribe,取消订阅,通过全局唯一的token,遍历所有主题,找到那个token,然后从主题的数组中删除
myObject.unsubscribe = function( token ) {
for ( var m in topics ) {
if ( topics[m] ) {
for ( var i = 0, j = topics[m].length; i < j; i++ ) {
if ( topics[m][i].token === token ) {
topics[m].splice( i, 1 );
return token;
}
}
}
}
return this;
};
}( pubsub ));
getCurrentTime = function (){
var date = new Date(),
m = date.getMonth() + 1,
d = date.getDate(),
y = date.getFullYear(),
t = date.toLocaleTimeString().toLowerCase();
return (m + "/" + d + "/" + y + " " + t);
};
// 模拟 向网格里添加新数据行
function addGridRow( data ) {
// ui.grid.addRow( data );
console.log( "updated grid component with:" + data );
}
// 记录网格最后更新时间
function updateCounter( data ) {
// ui.grid.updateLastChanged( getCurrentTime() );
console.log( "data last updated at: " + getCurrentTime() + " with " + data);
}
// 统一处理,更新网格
gridUpdate = function( topic, data ){
if ( data !== undefined ) {
addGridRow( data );
updateCounter( data );
}
};
// 创建一个对"newDataAvailable"主题的订阅者
var subscriber = pubsub.subscribe( "newDataAvailable", gridUpdate );
// 下面代表着数据层的更新。通过ajax请求数据然后广播更新数据同样可用
// 发布新消息,通知观察者,观察者发生数据更新,网格增加一行
pubsub.publish( "newDataAvailable", {
summary: "Apple made $5 billion",
identifier: "APPL",
stockPrice: 570.91
});
pubsub.publish( "newDataAvailable", {
summary: "Microsoft made $20 million",
identifier: "MSFT",
stockPrice: 30.85
});
console