AngularJS混合来自不同模块的相同名称控制器

时间:2016-07-18 11:28:40

标签: javascript angularjs

我正在开发一个AngularJS Web应用程序,它有很多子模块。其中两个子模块具有CRUD功能,因此这两个模块都有一些具有相同名称的控制器。要了解代码的外观,请查看下面的代码段:

<!DOCTYPE html>
<html>

<head>
  <script data-require="angular.js@1.5.6" data-semver="1.5.6" src="https://code.angularjs.org/1.5.6/angular.min.js"></script>
  <link rel="stylesheet" href="style.css" />
  <script>
    angular
      .module('app', [
        'app.one',
        'app.two'
      ]);

    angular
      .module('app.one', [])
      .controller('MyCtrl', function() {
        var vm = this;
        vm.message = 'Hello World from app.one!';
      });

    angular
      .module('app.two', [])
      .controller('MyCtrl', function() {
        var vm = this;
        vm.message = 'Hello World from app.two!';
      });
  </script>
</head>

<body ng-app="app" ng-controller="MyCtrl as vm">
  <h1>{{ vm.message }}</h1>
</body>

</html>

您也可以在plnkr:http://plnkr.co/edit/JRwJsrJd84nPnjj36GAZ找到这个。

现在,问题是我感到困惑。对我来说,AngularJS混淆同名控制器但在不同模块中是不合理的。如果有人能解释这一点,并提出一种克服这一点的方法,我真的很感激。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您的控制器应具有唯一的名称。在您的app.js中,您确实喜欢以下

angular
    .module('app', [
        'app.one',
        'app.two'
      ]);

Angular会同时加载app.oneapp.two当你在这两个模块中都有一个名为MyCtrl的控制器时,它只会选择最新的控制器。在这种情况下,来自app.two的控制器。

您可以根据条件选择性地加载您想要的模块,或者只是拥有唯一的控制器名称来克服这个问题!