注入解析UI-Router中每个控制器的依赖关系

时间:2016-06-17 08:16:50

标签: angularjs angular-ui-router

我有这样的ui路由器状态:

$stateProvider.state('parent', {
  templateUrl: 'tpl/a.html',
  resolve: {
    resA: function() {
        return { 'value': 'A' };
    }
  },
  controller: function($scope, resA) {
    $scope.resA = resA.value;
  }
});

在模板html中我使用另一个控制器(子控制器)。这个子控制器需要解决ui路由器状态的依赖性。但是,它并没有注入儿童控制器。

TPL / a.html

<h1>Hello</h1>
<div ng-controller="ChildCtrl">
</div>

ChildCtrl

var app = angular.module('app', []);
app.controller('ChildCtrl', function($scope, resA) {
   // some codes
});

我收到错误,在ChildCtrl中resA unkonwn。如何在ChildCtrl中注入resA?

2 个答案:

答案 0 :(得分:2)

我看到3个选项:

1)将值放在父控制器的$ scope

   //it would be available in child controller in `$scope.a`
 $stateProvider.state('parent', {
  templateUrl: 'tpl/a.html',
  resolve: {
    resA: function() {
        return { 'value': 'A' };
    }
  },
  controller: function($scope, resA) {
    $scope.resA = resA.value;
  }
})
.state('parent.child', {
  templateUrl: 'tpl/child.html',
  controller: function($scope) {
    console.log($scope.resA) //'{value: "A"}'
  }
});

2)将子控制器作为子路由的控制器,并在那里解析resA

var a = { 'value': 'A' };
$stateProvider.state('parent', {
  templateUrl: 'tpl/a.html',
  resolve: {
    resA: function() {
        return  a;
    }
  },
  controller: function($scope, resA) {
    $scope.resA = resA.value;
  }
})
.state('parent.child', {
  templateUrl: 'tpl/child.html',
  resolve: {
    resA: function() {
        return a;
    }
  },
  controller: function($scope, resA) {
    $scope.resA = resA.value;
  }
});

3)制作一些服务,为控制器提供数据(现在存储在resA中)并将其注入两个控制器

答案 1 :(得分:0)

结账@BotanMan的回答。

另一种方式,类似于3.答案。

将您的资源投入服务。

var app = angular.module('app');
app.service('resA', function() {
   // your service here
});

包括它:

$stateProvider.state('parent', {
  templateUrl: 'tpl/a.html',
  resolve: {
    resA: 'resA' //your service name
  },
  controller: function($scope, resA) {
    $scope.resA = resA.value;
  }
});

因此,您可以像预期的那样使用该资源:

var app = angular.module('app', []);
app.controller('ChildCtrl', function($scope, resA) { //now it should work
   // some codes
});

请参阅解析时的docs