簡體   English   中英

UI路由器無法將已解析的對象注入控制器

[英]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
}]);

我在這里看到一些問題。

  1. 您不會從lists.getAll()lists.getList()返回承諾。 在不返回承諾的情況下,UI路由器不知道在調用控制器之前等待解決承諾。 要解決此問題,請在兩者中的$http調用之前放置一個return
  2. 直接在lists.getList()調用URL id可能是錯誤的,因為這將導致對URL的請求只是一個數字,而沒有其他要求。 而且它也是一個相對URL,您可能不希望這樣做。
  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM