在指令中使用“require:ngController”和“controller:”有什么区别?

时间:2015-06-23 10:30:35

标签: angularjs angularjs-directive angularjs-scope

我正在使用:

创建的指令切换
return {
    restrict: 'E',
    templateUrl: '/src/templates/noise/swatches.html',
    link: link,
    controller: "swatchesController"
};

<swatches-directive></swatches-directive>

使用:

return {
    restrict: 'E',
    templateUrl: '/src/templates/noise/swatches.html',
    link: link,
    require: "ngController"
};

<swatches-directive ng-controller="swatchesController"></swatches-directive>

这似乎对属于其他指令的现有手表产生了意想不到的副作用,这些指令针对swatches-directive指定的范围变量。根据我的理解,新方法引入了一个新范围,因此将监视变量分配给父范围似乎应该可以工作,但这些监视器拒绝触发。

上面使用的两种方法之间是否存在根本差异?

2 个答案:

答案 0 :(得分:0)

几点需要注意:

  1. 您应该使用controllerAs属性来隔离 控制器。它被认为是最佳做法。你可以阅读它here
  2. 理想情况下,您应该在指令本身内提供控制器。您进行此操作的方式会导致spagetti范围。将指令范围与父范围分开。如果需要,可以将所需的依赖项传递给指令。

答案 1 :(得分:0)

return {
    restrict: 'E',
    templateUrl: '/src/templates/noise/swatches.html',
    link: link,
    require: "ngDirective", //Get the controller of that directive
    link : function(scope, element, attributes, ngController){

      //With require, you say: get the controller of that directive. You can       
      //then use it as 4th parameter (ngController) 

    }

};

注意:您可以传递多个控制器

return {
    restrict: 'E',
    templateUrl: '/src/templates/noise/swatches.html',
    link: link,
    require: ["ngDirective1", "ngDirective2"], //Get the controller of that directive
    link : function(scope, element, attributes, controllers){
      var ctrl1 = controllers[0];
      var ctrl2 = controllers[1];

      //Require can be a string or, as this example, an array.

    }

};

内部传递的指令必须在您的指令中。 如果不是,您可以说:在^的容器元素上找到它: require : '^ngDirective'