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

3
我有一个网页,其中包含一个名为“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中正确打开。
但是,如果我再次点击“启动门户网站”按钮,同样的AJAX代码将被调用,并且我会再次获取AngularJS门户网站的URL并重新加载。这个过程可以正常工作,但有一个问题。
我在AngularJS的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()方法。在随后的点击中,它确实重新加载了来自服务器端的门户URL的iframe,但是angularjs的run()方法不再被调用。
我尝试手动引导angular应用程序,但无法正常工作。
不知何故,每当iframe加载我的angularjs门户时,我都希望杀死或重新加载整个angularjs应用程序,并从头开始。
我不能对iframe代码进行任何修改,因为在生产中,那将是我的客户网站。我只需要向他们提供angularjs门户网址,他们将使用我使用的类似方法进行加载。

1
看起来工作正常 http://plnkr.co/edit/VT5DUXgYN0ppXkJgaLvC?p=preview(检查控制台以查看它是否正常工作)。我还尝试通过在我的电脑上运行另一个域来进行跨域测试,但仍无法复现该问题。您使用的是哪个浏览器? - Khanh TO
2个回答

2

通过控制浏览器行为,可以轻松实现此功能。

要通过HTTP头或标签从您的Web服务器控制iframe页面的浏览器缓存。

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

AngularJS可以控制Angular应用程序的加载方式,但无法控制iframe缓存。只有当整个页面重新加载时,iframe才会重新加载。


谢谢,但是另一个版本的逻辑帮了我。 - Pawan Pillai

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,因为它在我的客户网站上,但是版本控制对我非常有帮助。谢谢 :) - Pawan Pillai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接