【问题标题】:AngularJS - How can I stop re-rendering templates again?AngularJS - 如何再次停止重新渲染模板?
【发布时间】:2014-02-14 08:13:47
【问题描述】:

AngularJS 中是否可以避免再次渲染视图?

我有一个页面,它从数据库中查询数据并将其显示到视图中,但是当我导航到另一个页面时,然后再次导航回来。它再次渲染视图。

在 AngularJS 中是否有可能只保留渲染的视图?我不想再次查询数据并重新渲染视图。我想立即显示渲染的视图,而无需再次查询数据。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    如果您将数据保存或缓存在服务中,则可以避免每次都查询服务器。 Promise 是一个很好的方法来做到这一点。考虑以下示例,该示例使用 $http 返回的承诺(但您可以使用 $q 轻松创建自己的承诺):

    app.controller('SomeController', function($scope, dataService) {
      dataService().success(function(data) {
        $scope.myData = data;
      });
    });
    
    app.factory('dataService', function($http) {
      var promise = null;
    
      return function() {
        if (promise) {
          return promise;
        } else {
          promise = $http.get("...");
          return promise;
        }
      };
    });
    

    由于第一次调用dataService()时设置了promise,如果已经存在则返回现有的promise,所以只有第一次调用dataService()才会真正进行HTTP调用;其余的将使用现有值。

    【讨论】:

    • 感谢您快速回复布兰登。 :) 这是一个很好的解决方案,但它会再次呈现视图或 html 吗?假设我们有 200 个项目,我们将使用 ng-repeat 显示它。当我们再次访问该页面时,它会再次运行 ng-repeat 吗?或者,Angular 将给我们之前的 html 视图,而无需再次运行 ng-repeat。
    • 是的,它会重新渲染视图。如果您的观点基于ngRoute,我不确定有什么方法可以防止这种情况发生。如果您要管理自己的视图,则可以使用 ngShow/ngHide,但请记住,当您的视图加载时,您的范围观察者将被触发。
    • 是的!我同意...我认为这就是为什么 Angular 由于这些观察者而无法立即再次显示 html 视图的原因。再次感谢布兰登。
    猜你喜欢
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2013-11-16
    • 2013-09-02
    • 1970-01-01
    • 2014-03-04
    • 2020-06-28
    • 1970-01-01
    相关资源
    最近更新 更多