2014-08-28 46 views
0

我想在我的应用程序中创建一个指令。但是,我需要在不同的地方使用指令,并且他们有自己的控制器。如何将控制器添加到指令?

在我的指令

所以

directive('test', [function($popover) { 
     return { 
      restrict: 'E', 
      scope: false, 
      link: function(scope, elem, attrs) { 

      } 
     }; 
    } 
]) 

如何添加两个控制器一个指令?

谢谢!

+1

我想你不能注入两个控制器,你应该考虑其他的方法 – 2014-08-28 19:32:49

+0

你不必注入控制器。您可以使用指定为属性的控制器。那种你在找什么? – PSL 2014-08-28 19:48:53

回答

1

您可以使用namecontroller="@"选项。

.directive('test', [function($popover) { 
     return { 
      restrict: 'E', 
      scope: false, 
      controller : "@", 
      name:"controller", 
      template:'<div>{{value}}</div>', 
      link: function(scope, elem, attrs) { 

      } 
     }; 
    } 

例如: -

<test controller="ctrl1"></test> 
    ..... 
    <test controller="ctrl2"></test> 

当您指定controller= '@'角将寻找注册的控制与元素的属性指定的属性值(你可以给属性的任何名称)中所提到的name选项。

Plnkr

下面是从角指令实施片段: -

  if (controllerDirectives) { 
     .... 

      controller = directive.controller; 
      if (controller == '@') { 
       controller = attrs[directive.name]; 
      } 

      controllerInstance = $controller(controller, locals); 
+0

嗯......在[文档](https://docs.angularjs.org/guide/directive)中找不到。你是怎么找到这个的?这有点令人困惑,关于使用相同的“@”来绑定独立的作用域绑定,以及明显没有记录的'name'属性用于指定控制器属性名称,所以您可以使用'name:“ctrl” ,''它会使用'crtl'属性而不是'controller',但是您仍然需要'controller:“@”,'... – 2014-08-28 19:52:45

+0

我在查看角度指令实现时发现它已经很久了,然后我试过了,但没有记录,我不知道为什么。您可以使用任何名称作为可以指定控制器的属性。它会查找'@'作为控制器名称。它与隔离范围的'@'无关。他们是2种不同的实现。 – PSL 2014-08-28 19:54:31

+0

@JasonGoemaat请参阅角度片段中的更新答案。 – PSL 2014-08-28 19:57:27

相关问题