【问题标题】:Inject resolved property into controller of abstract parent将已解析的属性注入到抽象父级的控制器中
【发布时间】:2015-02-17 14:20:40
【问题描述】:

我已经这样定义了我的 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 属性向下移动到子状态,我的控制器永远不会被调用。

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

【问题讨论】:

    标签: angularjs angular-ui-router


    【解决方案1】:

    正如 here 所记录的,解析可以被继承。不是从孩子注射到父母。

    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. $stateParamchild 中定义
    2. 依赖它的resolve应该被注入到parent

    不能工作 - 因为一个父母会被许多孩子共享。

    父母会留下来,而孩子的参数会有所不同..

    【讨论】:

    • 但是如何将一些东西注入子状态的控制器(与 abstract 父状态的控制器相同)?
    • 要知道的非常重要的事情是:父控制器和子控制器永远不会相同。绝不。它们的类型(定义)可能是,但它们是运行时的不同实例。因此,您应该为子状态引入特殊控制器 - 使用解析器。这将完全简化对状态的思考......
    • 我的印象是,由于父状态是抽象的,因此在运行时只会存在一个控制器实例。请你澄清一下好吗?很明显,我没有一个 detailsControllers 作为另一个 detailsController 的孩子。
    • 每个视图都有一个控制器。甚至是隐含的......它们是(每个视图的控制器)独立实例。所以你的子状态应该有 template: xxx 和 controller: yyy 定义。这些将被注入到父母 ui-view=""。查看有关 UI-Router 的基本示例
    • this answer 是指向最重要资源的链接,您应该仔细阅读。大多数情况下,state.js 链接帮助我了解如何使用 UI-Router
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2015-04-18
    相关资源
    最近更新 更多