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 路径 报错问题 解决办法