這聽起來像是使用應用程序事件的好例子。
你會想要一個對象有一個發佈/訂閱接口:
var dispatcher = {
subscriptions: {},
publish: function(eventName, publisher, data) {
// loop through subscribers and notify them, passing publisher and data
// var subscriber = this.subscribers[eventName][i];
// subscriber.callback.call(subscriber.context, publisher, data);
},
subscribe: function(eventName, context, callback) {
this.subscriptions[eventName] = this.subscriptions[eventName] || [];
this.subscriptions[eventName].push({
context: context,
callback: callback
});
}
};
當你打開一個新的窗口,設置該對象的引用作爲新窗口的屬性。
var win = window.open(...);
win.dispatcher = dispatcher;
現在每個窗口,包括「頂」窗口應該有一個名爲dispatcher
全局變量,你可以用它來訂閱和發佈事件:
(從主窗口)
dispatcher.subcribe("item.added", this, function(publisher, data) {
// "publisher" is the object publishing the event
// "data" is arbitrary data passed along in the event
});
(來自子窗口)
dispatcher.publish("item.added", this, {
name: "Foo"
});
我還沒有使用AngularJS,s o我不確定它是否包含DOM事件之外的某種事件框架。在JavaScript中有很多pub/sub模型的實現,你可以在Google搜索中投擲一個Dart,然後登陸一個。我創建了一個簡單的JavaScript類庫,可能適合賬單。它沒有外部依賴:https://github.com/gburghardt/events
優勢
- 有很好的表現,因爲它不依賴於HTTP請求/響應週期
- 相當簡單的設置
- 跨瀏覽器支持沒有黑客或polyfills
缺點
- 如果主窗口關閉,那麼您的子窗口將失去與外部世界的連接,發佈的事件將會充耳不聞。
聽起來像網絡套接字可能適合該法案:http://www.html5rocks.com/en/tutorials/websockets/basics/ –
@ChrisHardie - 如果可能的話,我希望保留所有的客戶端。 –
根據我正在閱讀的內容,我認爲您確實需要一臺服務器來調解您所有客戶之間的對話。 –