Angularjs ng-controller with resolve

前端 未结 8 650
时光取名叫无心
时光取名叫无心 2021-02-01 20:30

I\'ve ran into problem with ng-controller and \'resolve\' functionality:

I have a controller that requires some dependency to be resolved before running, it works fine w

8条回答
  •  渐次进展
    2021-02-01 21:08

    Presuming that Service.getData() returns a promise, MyController can inject that Service as well. The issue is that you want to delay running the controller until the promise resolves. While the router does this for you, using the controller directly means that you have to build that logic.

    angular.module('myApp')
      .controller('MyController', ['$scope', 'Service', function ($scope, Service) {
        $scope.data = {}; // default values for data 
        Service.getData().then(function(data){
          // data is now resolved... do stuff with it
          $scope.data = data;
        });
      }]
    );
    

    Now this works great when using the controller directly, but in your routing example, where you want to delay rendering a page until data is resolved, you are going to end up making two calls to Service.getData(). There are a few ways to work around this issue, like having Service.getData() return the same promise for all caller, or something like this might work to avoid the second call entirely:

    angular.module('myApp')
      .controller('MyController', ['$scope', '$q', 'Service', function ($scope, $q, Service) {
        var dataPromise,
          // data might be provided from router as an optional, forth param
          maybeData = arguments[3]; // have not tried this before
        $scope.data = {}; //default values
        // if maybeData is available, convert it to a promise, if not, 
        //    get a promise for fetching the data
        dataPromise = !!maybeData?$q.when(maybeData):Service.getData();
        dataPromise.then(function(data){
          // data is now resolved... do stuff with it
          $scope.data = data;
        });    
      }]
    );
    

提交回复
热议问题