控制器构造函数在Angular中执行多次

时间:2014-12-16 15:07:31

标签: javascript angularjs angularjs-directive angularjs-scope

所以我的问题是Controller构造函数执行多次。如果我有2 Directives与特定Controller相关联,那么它会运行2 + 1,如果是3 Directives,则3 + 1 ...依此类推。如果我在该控制器中有一个ajax请求来获取数据,那么它会运行很多次,这并不是真正的必要...

为什么会这样?我非常担心它会使所有那些额外的不必要的ajax请求......

HTML:

 <span ng-controller="MenuController as MenuCtrl">
    <main-menu></main-menu>
 </span>

控制器:

  var howManyTimes = 0;
  angular.module("shredkit", ["myDirectives"])

  .controller("MenuController", function(){
    ++howManyTimes;
    console.log("HOW MANY TIMES? THAT MANY: " + howManyTimes )
  })

指令:

angular.module("myDirectives", [])

  .directive("mainMenu", function(){
    return{
      restrict:"E", // type of directive - 'E' - element
      templateUrl:'templates/main-menu.html',
      controller:"MenuController",
      controllerAs: "MenuCtrl"
    };
  })

2 个答案:

答案 0 :(得分:8)

您的控制器为ng-controller标签运行一次:

 <span ng-controller="MenuController as MenuCtrl">

每次启动一个新的DOM元素时,该范围都在其中:

 controller:"MenuController"

这是因为角度控制器不是单例,它们是在每次使用时构造和启动的。

如果您打算使用多个控制器,因为您想要共享数据,请通过以下两种方式进行:

  1. 有一个包含所有孩子的父控制器
  2. 使用共享服务来保存状态

答案 1 :(得分:1)

您在div中使用MenuController,也在您的指令中使用(同一个)。显然,控制器是针对它们所分配的每个元素执行的,包括指令

中的赋值