IFrame 中的 AngularJS run() 方法不会在 iframe 重新加载时重新运行

Posted

技术标签:

【中文标题】IFrame 中的 AngularJS run() 方法不会在 iframe 重新加载时重新运行【英文标题】:AngularJS run() method in IFrame does not rerun on iframe reload 【发布时间】:2014-05-06 02:25:33 【问题描述】:

我有一个网页,上面有一个"Start Portal" 按钮,下面有一个 iframe(在同一网页上),id 为:MyFrame

我使用 jQuery AJAX 获取基于 angularjs 的门户的 URL,并设置 iframe 的 src。下面给出了加载基于 angularjs 的门户的代码。 'portalURL' 参数包含 URL。

$.ajax(
            method: 'post',
            crossDomain: true,
            contentType: "application/json; charset=utf-8",
            url: webmethodurl,
            data: ,
            dataType: "jsonp",
            jsonp: "JSONCallback",
            success: function(portalURL)
                $('#MyFrame').attr('src',portalURL);
            ,
            error: function(e)
                console.log(e);
            
        );

这工作正常,我的 AngularJS 门户在 iframe 中正确打开。

但是,如果我再次单击"Start Portal" 按钮,则会调用相同的 AJAX 代码,并且我再次获得 AngularJS 门户 URL 并再次加载。这工作正常,但有 1 个问题。

我有一些用 AngilarJS run() 方法编写的认证代码:

//Some initializing code before Angular invokes controllers
MyApp.run(['$rootScope', function($rootScope) 
    ValidateSession();                   //1. First validate the session
]);

function ValidateSession()
    //this does some validation checks

现在,我的问题是,这个run() 方法只有在我第一次单击"Start Portal" 时才会被调用。在随后的点击中,它会从服务器端重新加载带有 Portal URL 的 iframe,但永远不会再次调用 angularjs run() 方法。

我尝试手动引导 Angular 应用,但无法正常工作。

我想以某种方式杀死或重新加载整个 angularjs 应用程序(如果它以前已加载)并在 iframe 加载我的 angularjs 门户时重新开始。

我无法对 iframe 代码进行任何修改,因为在生产中这将是我客户的网站。我只需向他们提供 angularjs 门户网址,他们将使用我使用的类似方法加载。

【问题讨论】:

它似乎工作正常plnkr.co/edit/VT5DUXgYN0ppXkJgaLvC?p=preview(检查控制台以查看它是否正常工作)。我还通过在我的 PC 上运行 1 个域来尝试跨域,但仍然无法重现该问题。你用的是什么浏览器? 【参考方案1】:

这可以通过控制浏览器行为轻松实现

使用 HTTP 标头或标签控制来自 Web 服务器的 iframe 页面的浏览器缓存。

<meta HTTP-EQUIV="CACHE-CONTROL" CONTENT="NO-CACHE">
<meta HTTP-EQUIV="PRAGMA" CONTENT="NO-CACHE"> 

Anguarjs 可以控制 Angular 应用程序的加载方式,但它无法控制 iframe 缓存。只有在整个页面加载完毕后才会重新加载 iframe。

【讨论】:

谢谢,但其他版本逻辑帮助了我。【参考方案2】:

为了防止 iframe 内容从缓存中加载,您可以将随机参数附加到 portalURL

success: function(portalURL) 
    // TODO: detect whether the portalURL already contains query string parameters
    // and use & instead of ?
    portalURL += '?v=' + (new Date()).getTime() + Math.floor(Math.random() * 1000000);
    $('#MyFrame').attr('src', portalURL);
,

【讨论】:

我怎么会错过版本逻辑。感谢您的回答,我在服务器端向我的 PortalURL 添加了一个版本并且它有效。我无法在我客户的网站上对 IFRAME src javascript 进行任何更改,但版本控制帮助了我。谢谢:)

以上是关于IFrame 中的 AngularJS run() 方法不会在 iframe 重新加载时重新运行的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs 中的iframe 标签 ng-src 路径 报错问题 解决办法

angularjs中的run()方法使用

AngularJS 模块中的run方法

Angularjs 中用于 iframe 的打印功能

在 .run 在路由中从 Angularjs 中的 url 中删除 #

无法使用 angularJS 将 URL 加载到 iframe