将控制器和指令交互的方式联系在一起

时间:2015-09-01 16:22:35

标签: javascript angularjs model-view-controller

我在过去几天里已经阅读了很多关于指令和控制器之间连接的内容。我已经做了一些观察,但我很难将它们放在一起,并且可以使用一些指导。

我看到控制器和指令混合的方式大约有四五种。

鉴于:

angular.module('myApp', []);
myApp.controller('ctrlName', function($scope){
   $scope.someVar = "some value";
});

我已经看到指令和控制器通过以下方式相互作用并相互连接:

1)用点链接

myApp.controller('ctrlName', function($scope){
   $scope.someVar = "some value within controller";
})
.directive('drtvName', function(){
   return {
     scope: {
       someVar: 'some value within directive'
     }
   }
});

2)控制器指定为指令的方法。如果它是点链的一部分(如#1)

,它如何与上面的控制器交互
myApp.directive('drtvName', function(){
   scope: {/*not sure what it means when this is simply an empty object*/},
   controller: function(scope){
    /*is this completely separate from myApp.controller('name', function(){});*/
   }
});

3)控制器被指定为app中单独控制器的名称。我不确定这两个scope会如何混合

myApp.directive('drtvName', function(){
   controller: 'ctrlName',
   scope: {
     connectedToCtrlScopeOrJustHTMLView: 'dunno'
   }
});

4)这是一个新的。控制器是父控制器所必需的。当我在修补这个问题时,我甚至无法使用链接方法将其工作,所以我不确定它什么时候有用

myApp.directive(drtvName', function(){
   scope: {},
   require: '^myParentController' //not sure what scope will be one line about with this option
});

1 个答案:

答案 0 :(得分:2)

您列出的互动方式有很多种,但我会在这里总结一下:

  1. 这说明了创建模块并向该模块添加指令和控制器。在这种情况下,它们不会相互交互,而是与模块本身相互作用。 .directive.controller的返回值是模块,因此链接来自。

  2. 在这种情况下,您将定义指令的控制器功能。要回答你的问题,是的,这是一个与你拥有它的方式完全不同的控制器,但是....

  3. 要进入下一点,您可以像在#1中一样在模块上定义控制器,然后在指令中使用它:

  4. 在你的模块中:

    module.controller('myController', function () {...});
    

    在你的指令中:

    controller : 'myController'
    

    这使得单元测试指令变得非常简单,并且可以将问题牢固地分开。

    1. 这是指令需要与另一个指令通信的时候。指令的控制器功能基本上就是它的API。因此,如果在指令中需要另一个指令,则必需指令的控制器函数作为第四个参数注入到链接函数中。
    2. 因此,在您的示例中,myParentController的控制器函数将作为链接函数的第四个参数注入,因此您可以像这样定义它:

      link : function (scope, element, attrs, myParentController)
      

      然后,在执行要求的指令中,您可以访问在您需要的控制器的控制器功能上定义的任何功能。

      希望有所帮助。