2014-10-29 50 views
5

因此,从我的angularUI路由设置中考虑以下片段。我正在浏览路线/类别/管理/ 4 /细节(例如)。我希望'类别'在相关控制器加载之前得到解决,事实上,我可以在解析函数内部放置一个断点,该解析函数返回类别服务中的类别并查看该类别已被返回。现在把另一个断点放在控制器内部,我可以看到'category'总是未定义的。它不是由UI路由器注入的。Angular UI路由器无法解析注入的参数

任何人都可以看到问题吗?它可能不在我提供的代码中,但由于我在运行代码时没有错误,因此无法确定问题的根源在哪里。典型的js沉默失败!

 .state('category.manage', { 
      url: '/manage', 
      templateUrl: '/main/category/tree', 
      controller: 'CategoryCtrl' 
     }) 
     .state('category.manage.view', { 
      abstract: true, 
      url: '/{categoryId:[0-9]*}', 
      resolve: { 
       category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
        return CategoryService.getCategory($stateParams.categoryId).then(returnData); //this line runs before the controller is instantiated 
       }] 
      }, 
      views: { 
       'category-content': { 
        templateUrl: '/main/category/ribbon', 
        controller: ['$scope', 'category', function ($scope, category) { 
         $scope.category = category; //category is always undefined, i.e., UI router is not injecting it 
        }] 
       } 
      }, 
     }) 
      .state('category.manage.view.details', { 
       url: '/details', 
       data: { mode: 'view' }, 
       templateUrl: '/main/category/details', 
       controller: 'CategoryDetailsCtrl as details' 
      }) 

回答

13

该概念正在工作。我创建了working plunker here。这些变化是在这里

,而不是这个

resolve: { 
    category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
     //this line runs before the controller is instantiated 
     return CategoryService.getCategory($stateParams.categoryId).then(returnData); 
    }] 
}, 

我刚刚返回的getCategory的结果...

resolve: { 
    category: ['CategoryService', '$stateParams', function (CategoryService, $stateParams) { 
     return CategoryService.getCategory($stateParams.categoryId); // not then 
    }] 
}, 

与天真的服务实现:

.factory('CategoryService', function() {return { 
    getCategory : function(id){ 
    return { category : 'SuperClass', categoryId: id }; 
    } 
}}); 

即使这将是一个承诺...决心将等待,直到它被处理...

.factory('CategoryService', function($timeout) {return { 
    getCategory : function(id){ 
    return $timeout(function() { 
     return { category : 'SuperClass', categoryId: id }; 
    }, 500); 
    } 
}}); 
+1

谢谢!绝对正确。奇怪的部分是我一直在使用$ http服务的语法,并且总是运行正常,并且考虑到我的类别服务返回了一个承诺,我认为它的工作原理是一样的。我需要弄清楚有什么不同,但再次感谢您的帮助。非常感激。 – 2014-10-29 22:23:42

+0

我没有看到这种用法的任何文档。并在文档中显示解析对象具有密钥,工厂。而工厂只接受字符串或功能... – Demonbane 2016-05-11 08:37:44

+0

最后,能够解决我自己的问题与此解决方案。谢谢! – 2017-10-20 06:19:13

相关问题