[英]UI-router can't inject resolved object into controller
我有一個列表列表,我試圖為每個列表制作一個詳細的(個人的)視圖。 我已經成功更改了URL 並從工廠檢索了對象,但是該對象從未進入控制器/視圖。 當我單擊詳細信息的鏈接時,視圖會更改,但是$ scope.list是未定義的。 我究竟做錯了什么?
配置 :
據我所知,錯誤是我執行解析的方式,但這是我嘗試過的唯一未引發錯誤的操作
.config(['$stateProvider', '$urlRouterProvider',
function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('lists', {
url: '/lists',
templateUrl: 'views/lists.html',
controller: 'ListsCtrl',
resolve: {
listsPromise: ['lists', function (lists){
console.log('LISTS State');
return lists.getAll();
}]
}
})
.state('list', {
url: '/{id}',
templateUrl: 'views/list.html',
controller: 'ListCtrl',
resolve: {
list: ['$stateParams', 'lists', function($stateParams, lists){
return lists.getList($stateParams.id);
}]
},
});
$urlRouterProvider.otherwise('/lists');
}]);
工廠 :
.factory('lists', ['$http',
function($http){
var lists = {
lists: []
};
lists.getAll = function(){
$http.get('/lists').success(function(res){
angular.copy(res, lists.lists);
});
};
lists.getList = function(id){
$http.get(id).then(function(res){
return res.data;
});
};
return lists;
}]);
控制器 :
一個控制器可以做到這一點嗎?
.controller('ListsCtrl', ['$scope', '$http', 'ngDialog', 'lists',
function($scope, $http, lists) {
console.log("controller loaded");
$scope.lists = lists.lists;
}])
.controller('ListCtrl', ['$scope', '$http',
function($scope, $http, list){
$scope.list = list;
console.log(list); //returns undefined
}]);
我在這里看到一些問題。
lists.getAll()
或lists.getList()
返回承諾。 在不返回承諾的情況下,UI路由器不知道在調用控制器之前等待解決承諾。 要解決此問題,請在兩者中的$http
調用之前放置一個return
。 lists.getList()
調用URL id
可能是錯誤的,因為這將導致對URL的請求只是一個數字,而沒有其他要求。 而且它也是一個相對URL,您可能不希望這樣做。 resolve
映射/對象中的鍵實際上僅是該控制器的本地依賴項的名稱,因此您應該將其作為控制器中的顯式依賴項。 它的價值將是諾言所能解決的。 要修復最后一個,請將ListCtrl
更改為以下內容:
.controller('ListCtrl', ['$scope', '$http', 'list',
function($scope, $http, list){
$scope.list = list;
console.log(list); //returns the correct thing
}]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.