是否可以知道哪个指令初始化了我的控制器

时间:2015-04-24 16:00:45

标签: angularjs angularjs-directive

假设我有两个指令:

angular.module('example').directive('dir1', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl'
};});

angular.module('example').directive('dir2', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl'
};});

是否有可能告诉哪个指令在此控制器内初始化ExampleCtrl

2 个答案:

答案 0 :(得分:1)

我想到了两种方式。这个解决方案我发现它不那么狡猾,但也不那么动态了:

angular.module('example').directive('dir1', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl',
    link: function(scope) {
      $scope.myDir="dir1";
    }
};});

angular.module('example').directive('dir2', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl'
    link: function(scope) {
      $scope.myDir="dir2";
    }
};});

通过这种方式,您可以将父指令烘焙到范围中,该范围可供控制器使用。

这个解决方案更加黑客,但也更具动感。使用this问题,我们可以获取包含元素:

function innerItem($scope, $element){
    var jQueryInnerItem = $($element); 
}

从那里,我们可以测试该元素的属性和属性,这些属性和属性特定于一个指令而不是另一个指令(例如指令名称)。我仍然认为这是非常hacky你有一个潜在的问题(这里可能有点XY问题),但这应该工作。

答案 1 :(得分:1)

你可以这样做:

angular.module('example').directive('dir1', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl',
    controllerAs: 'dir1Ctrl'
};});

angular.module('example').directive('dir2', function () {
  return {
    restrict: 'A',
    scope: true,
    controller: 'ExampleCtrl',
    controllerAs: 'dir2Ctrl'
};});

然后,在控制器中$scope.dirNcontroller,其中N为1或2或您拥有的数量,只有来自指令N才会存在。这就是controllerAs语法的工作原理,它只是发布到范围。

这样的事情:

app.controller('ExampleCtrl', function($scope, $element) {
  if ($scope.dir1Ctrl) /* do something */
  if ($scope.dir2Ctrl) /* do something else */
});

PLUNKER