【发布时间】:2014-11-19 19:19:48
【问题描述】:
我试图从解析中返回一个数据列表,然后在我的控制器中访问该列表。 Resolve 假设在控制器加载之前触发,但似乎恰恰相反。
dbdata.getlist 是一个使用 $http.get 的 api 调用,它返回一个列表。
$routeProvider
.when('/main', {
templateUrl: 'views/main.html',
resolve : {
listdata: ['$q','dbdata',function ($q,dbdata) {
dbdata.getlist(function(data){
return data;
});
}]
},
controller: 'MainCtrl'
})
....
}
angular.module('amebaTvApp')
.controller('MainCtrl', ['$scope',
function ($scope,listdata) {
$scope.list = listdata;
...
}]);
建议修改:
当我尝试下面的代码时,我得到 Cannot read property 'then' of undefined
listdata: ['$q','dbdata',function ($q,dbdata) {
var deferred = $q.defer();
dbdata.getFeatures(function(data){
deferred.resolve(data);
});
return deferred.promise;
}]
....
listdata.then( function(data) {
$scope.list = data;
});
控制器加载时lisdata似乎未定义,这就是我收到错误的原因:无法读取未定义的属性'then'
如果我像这样访问列表数据:$route.current.locals.listdata 那么它可以工作。
【问题讨论】:
-
检查控制器中的承诺... listdata.then( function(data) { $scope.list = data; })
-
@Asik 我正在返回一个列表,因此函数 'then' 不能应用于它。
-
@Fabii 你从你的回调函数返回一个列表不是从你的解析函数。
resolve的想法是返回一个 Promise,当该 Promise 解决后,它将允许更改路由并将该值从 Promise 注入到您的新控制器中。 -
让 getList 返回一个 promise,然后用
then链接返回它 -
@Brocco 我上面建议的编辑是否正确?