Delaying AngularJS route change until model loaded to prevent flicker

后端 未结 13 2293
误落风尘
误落风尘 2020-11-22 02:28

I am wondering if there is a way (similar to Gmail) for AngularJS to delay showing a new route until after each model and its data has been fetched using it

13条回答
  •  情歌与酒
    2020-11-22 03:29

    I see some people asking how to do this using the angular.controller method with minification friendly dependency injection. Since I just got this working I felt obliged to come back and help. Here's my solution (adopted from the original question and Misko's answer):

    angular.module('phonecat', ['phonecatFilters', 'phonecatServices', 'phonecatDirectives']).
      config(['$routeProvider', function($routeProvider) {
        $routeProvider.
          when('/phones', {
            templateUrl: 'partials/phone-list.html', 
            controller: PhoneListCtrl, 
            resolve: { 
                phones: ["Phone", "$q", function(Phone, $q) {
                    var deferred = $q.defer();
                    Phone.query(function(successData) {
                      deferred.resolve(successData); 
                    }, function(errorData) {
                      deferred.reject(); // you could optionally pass error data here
                    });
                    return deferred.promise;
                 ]
                },
                delay: ["$q","$defer", function($q, $defer) {
                   var delay = $q.defer();
                   $defer(delay.resolve, 1000);
                   return delay.promise;
                  }
                ]
            },
    
            }).
          when('/phones/:phoneId', {
            templateUrl: 'partials/phone-detail.html', 
            controller: PhoneDetailCtrl, 
            resolve: PhoneDetailCtrl.resolve}).
          otherwise({redirectTo: '/phones'});
    }]);
    
    angular.controller("PhoneListCtrl", [ "$scope", "phones", ($scope, phones) {
      $scope.phones = phones;
      $scope.orderProp = 'age';
    }]);
    

    Since this code is derived from the question/most popular answer it is untested, but it should send you in the right direction if you already understand how to make minification friendly angular code. The one part that my own code didn't requires was an injection of "Phone" into the resolve function for 'phones', nor did I use any 'delay' object at all.

    I also recommend this youtube video http://www.youtube.com/watch?v=P6KITGRQujQ&list=UUKW92i7iQFuNILqQOUOCrFw&index=4&feature=plcp , which helped me quite a bit

    Should it interest you I've decided to also paste my own code (Written in coffeescript) so you can see how I got it working.

    FYI, in advance I use a generic controller that helps me do CRUD on several models:

    appModule.config ['$routeProvider', ($routeProvider) ->
      genericControllers = ["boards","teachers","classrooms","students"]
      for controllerName in genericControllers
        $routeProvider
          .when "/#{controllerName}/",
            action: 'confirmLogin'
            controller: 'GenericController'
            controllerName: controllerName
            templateUrl: "/static/templates/#{controllerName}.html"
            resolve:
              items : ["$q", "$route", "$http", ($q, $route, $http) ->
                 deferred = $q.defer()
                 controllerName = $route.current.controllerName
                 $http(
                   method: "GET"
                   url: "/api/#{controllerName}/"
                 )
                 .success (response) ->
                   deferred.resolve(response.payload)
                 .error (response) ->
                   deferred.reject(response.message)
    
                 return deferred.promise
              ]
    
      $routeProvider
        .otherwise
          redirectTo: '/'
          action: 'checkStatus'
    ]
    
    appModule.controller "GenericController", ["$scope", "$route", "$http", "$cookies", "items", ($scope, $route, $http, $cookies, items) ->
    
      $scope.items = items
          #etc ....
        ]
    

提交回复
热议问题