如何使用AngularJS重新加载或重新呈现整个页面

时间:2013-05-22 23:28:24

标签: javascript angularjs node.js reload rerender

在基于多个用户上下文呈现整个页面并发出多个$http请求之后,我希望用户能够切换上下文并再次重新呈现所有内容(重新发送所有$http个请求,等等)。如果我只是将用户重定向到其他地方,那么事情就会正常运行:

$scope.on_impersonate_success = function(response) {
  //$window.location.reload(); // This cancels any current request
  $location.path('/'); // This works as expected, if path != current_path
};

$scope.impersonate = function(username) {
  return auth.impersonate(username)
    .then($scope.on_impersonate_success, $scope.on_auth_failed);
};

如果我使用$window.location.reload(),那么等待响应的$http上的auth.impersonate(username)个请求会被取消,所以我无法使用它。此外,黑客$location.path($location.path())也不起作用(没有任何反应)。

是否有另一种方法可以重新呈现页面而无需再次手动发出所有请求?

13 个答案:

答案 0 :(得分:397)

对于记录,要强制角度重新渲染当前页面,您可以使用:

$route.reload();

根据AngularJS documentation

  

即使$ location未更改,也会导致$ route服务重新加载当前路由。

     

因此,ngView创建新范围,重新实现控制器。

答案 1 :(得分:310)

$route.reload()将重新初始化控制器,但不会重新初始化服务。如果要重置应用程序的整个状态,可以使用:

$window.location.reload();

这是standard DOM method您可以访问注入$window服务。

如果您想确保从服务器重新加载页面,例如当您使用Django或其他Web框架并且想要新的服务器端渲染时,请将true作为参数传递给{{1 },如the docs中所述。由于这需要与服务器进行交互,因此速度会慢一些,只有在必要时才这样做

Angular 2

以上内容适用于Angular 1.我没有使用Angular 2,看起来服务有所不同,有reloadRouterLocation。我没有在那里测试不同的行为

答案 2 :(得分:38)

为重新加载给定路径路径的页面: -

$location.path('/path1/path2');
$route.reload();

答案 3 :(得分:28)

如果您使用 angular ui-router ,这将是最佳解决方案。

$scope.myLoadingFunction = function() {
    $state.reload();
};

答案 4 :(得分:24)

好吧,也许您在声明控制器的依赖关系时忘记添加“$ route”:

app.controller('NameCtrl', ['$scope','$route', function($scope,$route) {   
   // $route.reload(); Then this should work fine.
}]);

答案 5 :(得分:9)

只需重新加载所有内容,请使用window.location.reload();与angularjs

查看工作示例

HTML

<div ng-controller="MyCtrl">  
<button  ng-click="reloadPage();">Reset</button>
</div>

angularJS

var myApp = angular.module('myApp',[]);

function MyCtrl($scope) {
    $scope.reloadPage = function(){window.location.reload();}
}

http://jsfiddle.net/HB7LU/22324/

答案 6 :(得分:5)

我认为最简单的解决方案是,

添加&#39; /&#39;每次回来时想要重新加载的路线。

例如:

而不是以下

$routeProvider
  .when('/About', {
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

使用,

$routeProvider
  .when('/About/', { //notice the '/' at the end 
    templateUrl: 'about.html',
    controller: 'AboutCtrl'
  })

答案 7 :(得分:5)

如果要在刷新正在使用的任何服务时刷新控制器,可以使用此解决方案:

  • 注入$ state

app.controller('myCtrl',['$scope','MyService','$state', function($scope,MyService,$state) {

    //At the point where you want to refresh the controller including MyServices

    $state.reload();

    //OR:

    $state.go($state.current, {}, {reload: true});
}

这将刷新控制器和HTML,您可以将其称为刷新或重新渲染

答案 8 :(得分:5)

在Angular 2(AngularJs)之前

通过路线

$route.reload();

如果您想重新加载整个应用程序

$window.location.reload();

Angular 2 +

import { Location } from '@angular/common';

constructor(private location: Location) {}

ngOnInit() {  }

load() {
    this.location.reload()
}

constructor(private location: Location) {}

ngOnInit() {  }

Methods (){
    this.ngOnInit();
}

答案 9 :(得分:4)

尝试以下操作之一:

    public class FileWatcher
    { 
     private FileSystemWatcher _watcherRoot;
     private Timer _timer;
     private readonly string _watchedPath;

    public FileWatcher(string path)
    {
        // _watcher = new FileSystemWatcher();
        _timer = new Timer();
        _watchedPath = path;


        InitWatcher();
    }

    public void InitWatcher()
    {
        _watcherRoot = new FileSystemWatcher();
        _watcherRoot.Path = _watchedPath;
        _watcherRoot.IncludeSubdirectories = true;
        _watcherRoot.EnableRaisingEvents = true;
        _watcherRoot.Created += new FileSystemEventHandler(OnCreated);

    }

    private void OnCreated(object sender, FileSystemEventArgs e)
    {

        if (e.ChangeType == WatcherChangeTypes.Created)
        {
            string fullPath = e.FullPath;
            if (sender == _watcherRoot)
            {
                // If detect new folder, set the timer to 5 sec
                _timer.Interval = 5000;
                _timer.Elapsed += OnTimedEvent;
                _timer.AutoReset = true;
                _timer.Enabled = true;

                // a directory
                Console.WriteLine($"{fullPath.ToString()} created on {DateTime.Now}");
            }

        }
    }

    private void OnTimedEvent(object sender, ElapsedEventArgs e)
    {
        // Create a 2nd Watcher??
        // Reset the timer in here??
    }

答案 10 :(得分:3)

使用以下代码,而不向用户发送私密重新加载通知。它将呈现页面

var currentPageTemplate = $route.current.templateUrl;
$templateCache.remove(currentPageTemplate);
$window.location.reload();

答案 11 :(得分:3)

我得到了这个用于删除缓存和重新加载页面的工作代码

查看

        <a class="btn" ng-click="reload()">
            <i class="icon-reload"></i> 
        </a>

<强>控制器

注射器: $ scope,$ state,$ stateParams,$ templateCache

       $scope.reload = function() { // To Reload anypage
            $templateCache.removeAll();     
            $state.transitionTo($state.current, $stateParams, { reload: true, inherit: true, notify: true });
        };

答案 12 :(得分:-7)

几个月来我一直在努力解决这个问题,唯一对我有用的解决方案是:

var landingUrl = "http://www.ytopic.es"; //URL complete
$window.location.href = landingUrl;