我会使用window.postMessage() 和window.on("message") 系统来连接这两个应用程序。
例如,假设在您的 iFrame 中,您有一个 ember 应用程序可以显示集合中的小部件,而在您的主应用程序中,您有一个 id 选择器。以下是它的工作原理。
在您的主应用中:
App.IndexController = Ember.Controller.extend({
//... other stuff
actions: {
showWidget: function () {
var id = parseInt(this.get("widgetId"), 10),
iframe = $("#inner_page")[0];
iframe.contentWindow.postMessage(
JSON.stringify({ type: "action", args: ["showWidget", id]}),
"*");
}
}
});
widgetId 是您要传递给 iframe 的 id(例如,可以绑定到文本字段)。您的 iframe 的 ID 为“inner_page”。 postMessage 调用中的第二个参数是来源,一旦通信正常,您应该考虑保护它。
iframe 应用的代码更有趣:
$(window).on("message", function(e) {
var message = JSON.parse(e.originalEvent.data),
handler = App.messageHandlers[message.type];
if (!handler) {
consolw.log("WARNING! Invalid action call!");
return;
}
handler(message);
});
App.messageHandlers = {
action: function (msg) {
if (App.activeController) {
App.activeController.send.apply(App.activeController, msg.args);
}
}
};
App.IndexRoute = Ember.Route.extend({
//...
setupController: function (controller, model) {
this._super(controller, model);
App.activeController = controller;
}
});
App.IndexController = Ember.Controller.extend({
//...
actions: {
showWidget: function (id) {
// update active widget, load route or whatever
}
}
});
几点说明: