45

模块路线:

var switchModule = angular.module('switchModule', []);

switchModule.config(['$routeProvider', function($routeProvider) {
    $routeProvider.
    when('/build-content', {templateUrl: 'build-content.html', controller: BuildInfoController});
}]);

控制器:

function BuildInfoController($http, $scope){
    alert("hello");
}

html:

<html ng-app="switchModule">
...
<body>
    <ul>
        <li><a href="#build-content"/></a></li>
    </ul>
    <div class="ng-view"></div>
</body>
...

每次单击超链接“”时,都会调用两次“BuildInfoController”。我在这里错过了什么吗?

4

10 回答 10

72

我今天遇到了同样的问题。我在我的 $routeProvider 和我的 html 中添加了控制器名称。

$routeProvider
    .when('/login', {
            controller: 'LoginController',
            templateUrl: 'html/views/log-in.html'
     })

在我看来

<div class="personalDetails" ng-controller="LoginController"> </div>

您可以从视图或路由提供程序中删除控制器名称。

于 2014-07-01T21:51:33.750 回答
42

我遇到了同样的问题,而且路由似乎有一个愚蠢的错误。正在进行某种重定向。

为了修复它,我只是在 href 中添加了一个斜杠,例如:

<li><a href="#/build-content/"></a></li>

我希望它也能为你解决问题。

于 2013-01-21T16:42:35.733 回答
16

我有一个类似的问题。我发现在路由中添加了一个斜杠,但在链接中没有按预期工作。

$routeProvider.
when('/build-content/',...);

有了这个标记

<li><a href="/build-content">Content</a></li>

然后 AngularJS 会将浏览器中的 URL 更正为 $routeProvider 中定义的内容。

奇怪的是,相反的似乎也适用于链接中的斜杠而不是路线。似乎只要尾随斜杠与解析匹配,控制器就不会被调用两次!

于 2013-06-07T15:29:00.613 回答
8

我的情况是有 2 个 ng-view 指令。我试图包装它,但无意中复制了它:

<div class="ng-view">
    <div ng-view></div>
</div>

拆掉包装,修好。

于 2014-08-28T05:18:31.230 回答
8

ng-controller如果存在,请从模板页面中删除该指令。

于 2015-10-25T10:22:40.437 回答
2

我遇到了同样的问题,发现如果你两次引导你的角度,你可能会遇到同样的错误。

在我的情况下,我<body ng-app>也有angular.bootstrap(document,['app']),这导致了控制器的双重初始化。

希望这可以为某人节省一些时间。

于 2014-03-27T22:57:14.983 回答
1

可以将控制器添加到 DOM 的多个元素,因此如果这样做可能会出现此问题,例如:

  <div id="myDiv1" ng-controller="myController" ....></div>
  ....
  <div id="myDiv2" ng-controller="myController" ....></div>
于 2017-09-15T06:23:04.790 回答
0

我为单个状态下的每个视图部分声明了 SomeController。这导致重复事件触发。

 .state('chat', {
            url: '/',
            views: {
                'content@': {
                    templateUrl: 'views/chat_wv1.html',
                    controller: 'ChatController'
                },
                'form@': {
                    templateUrl: 'views/chat_wv_placeholder.html',
                    controller: 'ViewController'
                },
                'sidePanel@': {
                     templateUrl: 'views/sidePanel_wv.html'
                     /* removing this part solved my issue*/
                     /*controller: 'ChatController'*/
                }

            }
        })

希望这对其他人有帮助。

于 2017-07-05T09:31:38.183 回答
0

我的 customDirective 也有类似的问题,并且无意中复制了我的控制器。

<html>
   <body ng-app="MyApp" ng-controller="MyDirectiveCtrl">
      <my-directive></my-directive>
   </body>
</html>

angular.directive('myDirectivie', [function() {
   return {
         restrict: 'E',
         controller: 'MyDirectiveCtrl',

         ...

   }
}]);

我通过在正文级别删除 ng-controller 标记来解决它

于 2017-07-06T22:47:57.390 回答
0

这是因为你有多个 ui-view

于 2017-07-20T14:19:22.837 回答