【问题标题】:Avoid angularJS partial views to be cached in IE避免在 IE 中缓存 angularJS 部分视图
【发布时间】:2014-09-06 01:47:40
【问题描述】:

我正在开发一个也有一些 angularJS 的 ASP.NET MVC 应用程序。我有一个主页,其中包含不同的选项卡,当您单击它们时,它们会加载有角度的局部视图。主页是这样的:

{ ... }     
<div class="widget-div" ng-controller="mainController"> 
    <div class="widget-body">
        <div class="tabs-left">
            <ul id="demo-pill-nav" class="nav nav-tabs tabs-left" style="width: 160px">
                <li ng-class="getMenuClass('/search')">
                    <a href="javascript:void(0);" ng-click="selectPage('search')">Search</a>
                </li>
                <li ng-class="getMenuClass('/addressVerification')">
                    <a href="javascript:void(0);" ng-click="selectPage('addressVerification')">Address Verification</a>
                </li>
                <li ng-class="getMenuClass('/dashboard')">
                    <a href="javascript:void(0);" ng-click="selectPage('dashboard')">Dashboard</a>
                </li>
                <li ng-class="getMenuClass('/editProfile')">
                    <a href="javascript:void(0);" ng-click="selectPage('editProfile')">Update Profile</a>
                </li>               
            </ul>
            <div class="tab-content">
                <div class="active tab-pane">
                    <ng:view />
                </div>
            </div>
        </div>
    </div>  
</div>
{ ... } 

在主控制器中,selectPage 方法如下所示:

$scope.selectPage = function (page) {
    //not relevant code removed here
    $location.path("/" + page);
};

当然,我已经定义了如下路线:

$routeProvider.when("/search", {
    templateUrl: "/Scripts/app/views/search.html"
});

现在,我需要的是这些局部视图不会被缓存,至少在开发过程中是这样。为此我使用了here提供的方法:

myApp.run(function($rootScope, $templateCache) {
   $rootScope.$on('$viewContentLoaded', function() {
      $templateCache.removeAll();
   });
});

除了在 Internet Explorer 中运行良好外,它总是会加载缓存的版本,即使按下 Ctrl+F5 也是如此。

另外,我尝试在布局 html 中设置 HTTP 标头,如下所示:

<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate" />
<meta http-equiv="Pragma" content="no-cache" />
<meta http-equiv="Expires" content="-1" />

但这没有用。

所以我的问题是是否有任何方法可以避免这种行为。

【问题讨论】:

  • 那些元标记只为 layout.html 文件本身设置缓存。您需要为来自服务器的响应设置缓存标头
  • 但是 _Layout.cshtml 是包含 html 头的文件,其他 html 文件只是部分视图。那我应该把这些行放在哪里?
  • 您将无法为此使用元标记。元标记只会在提供给浏览器的原始页面上读取(与视图完全分开)。您需要使用 ASP.NET 来修改响应标头并为部分设置这些值
  • 这些部分视图由 angularJS 提供,我不知道在这种情况下该怎么做。
  • 我会看看这个:stackoverflow.com/questions/2195266/… - 你可以定位 /Scripts/app/views 目录

标签: javascript asp.net-mvc angularjs caching browser-cache


【解决方案1】:

我找到了一个正是我需要的解决方法。像这样向路由添加版本号:

$routeProvider.when("/search", {
    templateUrl: "/Scripts/app/views/search.html" + version
});

其中版本是一个字符串,例如:?v1.0.0

这样,每当我进行更改时,我只需更改版本号,当点击该页面时,部分视图将再次下载。

【讨论】:

  • 请注意,这应该完全禁用缓存。 HTTP 规范说带有查询字符串的 GET 请求应该禁用缓存。因此,从技术上讲,您不会为?v1.0.0 缓存一个文件,而为?v.1.1.0 缓存一个单独的文件 - 只要您有查询字符串,它从技术上讲永远不会缓存。一些浏览器尊重这种版本缓存,一些尊重规范
  • 在同一主题上查看此great link
  • @HarishR,我知道我可以禁用浏览器的缓存进行开发,仅此而已。问题是,有一个客户端定期检查网站,当我进行更新时,他没有看到更改,我必须告诉他们清除浏览器的缓存,这并不理想
  • Web.config 解决方案也应该适用于客户端系统
【解决方案2】:

在 web.config 中使用下面的标签来禁用缓存

   <staticContent>
       <clientCache cacheControlMode="DisableCache" />
    </staticContent>

【讨论】:

  • 你用的是哪个浏览器?? chrome有禁用缓存选项,你启用了吗? check this
  • also.. 你有没有在上面添加到 部分?您所说的解决方案也不适用于浏览器。
  • 我在 Firefox、Chrome 和 IE 中进行了测试。但 IE 是唯一表现不同的。
  • 正是 Ian 在评论中指出的内容,以及 i.e. 的一些问题,但找不到相关链接,对此感到抱歉。
  • @brabertaser1992 在 web.config 中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-19
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
相关资源
最近更新 更多