Angularjs在初始化控制器函数之前强制解析数据

时间:2015-12-08 15:24:57

标签: angularjs scope angular-ui-router resolve

我的应用程序中有以下代码(删除了代码,因此可能存在拼写错误)

基本上我需要确保$scope.takeovers在执行任何其他代码之前都有数据。

在浏览器中监控网络活动时,我可以看到/api/pagedata正在调用并成功输出我想要的数据$scope

$scope.takeovers始终未定义。

目前我有这个不起作用。

app.js

var app = angular.module('app', ['ui.router']);

app.config(function($stateProvider, $urlRouterProvider) {
    $urlRouterProvider.otherwise('/');

    $stateProvider
    .state('index', {
        url : '/',
        resolve: {
            takeovers: function(pageSetup) {
                return pageSetup.getData().$promise;
            }
        },
        controller: 'newFormController',
        templateUrl: '/templates/form.html'
    })
});

app.controller('newFormController', ['$scope', 'takeovers', function($scope, takeovers) {

    $scope.takeovers = takeovers.data; //Is empty when controller is initiated...

    /* continue with code that rely on $scope.takeovers */


}]);

app.factory('pageSetup', ['$http', function($http) {
  var res = {
    getData: function() {
      var promise = $http({ 
        method: 'GET', 
        url: '/api/pagedata' 
      });
      promise.success(function(data, status, headers, conf) {
        return data;
      });
      return promise;
    }
  }
  return res;
}]);

/ api / pagedata 结果

["2015-11-01","2015-11-02","2015-11-03","2015-11-08","2015-11-09","2015-11-10","2015-11-11","2015-11-15","2015-11-16","2015-11-29","2015-11-30"]

我错过了什么?

1 个答案:

答案 0 :(得分:4)

我认为return pageSetup.getData().$promise;的最后部分是你的问题。 getData已经返回一个promise,所以你需要做的就是直接返回它。

return pageSetup.getData();

您还可以直接在resolve函数中解析promise,并返回结果。我不认为在简单的情况下实际上会改变任何东西,但它允许您在将结果发送到控制器之前操纵结果或抓取其中的特定部分。所以有些东西:

resolve: {
    takeovers: function(pageSetup) {
        pageSetup.getData().then(function(response) {
            return response.data;
        });
    }
}