【问题标题】:passing parameter to ember in iframe将参数传递给 iframe 中的 ember
【发布时间】:2014-08-15 16:29:09
【问题描述】:

从另一个应用程序向 ember.js 传递参数的最佳做法是什么。 例如,我需要单击主页中的链接并将参数传递给 iframe 中的 ember。 我是通过 cookie 完成的,并在循环中检查值,但这不是一个好习惯。

 setInterval(function(){
      Ember.$.getJSON('/url'+Ember.$.cookie("id")).then(function(response){...});
        }, 500);

【问题讨论】:

    标签: javascript iframe ember.js iframe-app


    【解决方案1】:

    我会使用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
                }
            }
        });
    

    几点说明:

    • 我们的消息有一个固定的“类型”属性。现在,这始终是“动作”,但如果您需要多种通信协议,它可能会很有用。

    • 您将需要某种方法来获取活动控制器或向其发送消息的路由。在此示例中,每次设置新控制器时,我都会缓存活动控制器 (App.activeController)。如果您使用此模型,则可能应该将其实现为 Route Mixin。不确定这在更大的应用程序中效果如何,但对于这个示例来说已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-08
      • 2015-07-23
      • 2013-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多