将已解析的属性注入到抽象父级的控制器中

时间:2015-02-17 14:20:40

标签: angularjs angular-ui-router

我已经定义了我的UI-Router状态:

$stateProvider.state('contact', {
        url: '/contactDemo',
        views: {
            'main': {
                controller: 'contactMainController',
                templateUrl: 'templates/contact.tpl.html'
            }
        }
    }).state('contact.details', {
        abstract: true,
        controller: 'contactDetailsController',
        templateUrl: 'templates/contact.details.tpl.html'
    }).state('contact.details.add', {
        url: '/add'
    }).state('contact.details.filter', {
        url: '/filter/{filterId}'
    }).state('contact.details.filter.record', {
        url: '/record/{recordId}',
        resolve: {
            record: ['$stateParams', 'Restangular', function($stateParams, Restangular) {
                return Restangular.one('records', $stateParams.recordId).get();
            }]
        }
    }).state('contact.details.filter.record.edit', {
        url: '/edit'
    });

现在我想将已解决的record注入contactDetailsController。如果我这样做,我会收到Unknown provider错误。我无法将resolve移动到抽象状态,因为从那里我无法访问$stateParams内的ID。

如果我将controller属性移动到子状态,则永远不会调用我的控制器。

有人知道如何将已解析的属性注入到抽象父状态的控制器中吗?

1 个答案:

答案 0 :(得分:1)

如记录here所述,可以继承resolve。不是从孩子注射到父母。

Inherited Resolved Dependencies

  

0.2.0版中的新功能

     

子状态将从父状态继承已解析的依赖关系,它们可以覆盖它们。然后,您可以将已解析的依赖项注入控制器并解析子状态的功能。

$stateProvider.state('parent', {
      resolve:{
         resA:  function(){
            return {'value': 'A'};
         }
      },
      controller: function($scope, resA){
          $scope.resA = resA.value;
      }
   })
   .state('parent.child', {
      resolve:{
         resB: function(resA){
            return {'value': resA.value + 'B'};
         }
      },
      controller: function($scope, resA, resB){
          $scope.resA2 = resA.value;
          $scope.resB = resB.value;
      }

简单解决方案:

  1. $stateParam孩子
  2. 中定义
  3. 依赖于它的resolve应注入
  4. 无法正常工作 - 因为很多孩子都会共享一位家长。

      

    在孩子的参数不同的情况下,父母会留下来。