对抗AngularJS执行控制器两次

我理解AngularJS会通过一些代码运行两次,有时甚至更多,例如$watch事件,不断检查模型状态等。

但是我的代码:

function MyController($scope, User, local) {

var $scope.User = local.get(); // Get locally save user data

User.get({ id: $scope.User._id.$oid }, function(user) {
  $scope.User = new User(user);
  local.save($scope.User);
});

//...

执行两次,在我的数据库中插入2条记录。 我显然还在学习,因为我一直在抨击我的头!


应用程序路由器指定导航到MyController如下所示:

$routeProvider.when('/',
                   { templateUrl: 'pages/home.html',
                     controller: MyController });

但我也有这个在home.html

<div data-ng-controller="MyController">

这消化了两次控制器。 从HTML中删除data-ng-controller属性解决了问题。 或者, controller:属性可能已从路由指令中删除。

使用选项卡式导航时也会出现此问题。 例如, app.js可能包含:

  .state('tab.reports', {
    url: '/reports',
    views: {
      'tab-reports': {
        templateUrl: 'templates/tab-reports.html',
        controller: 'ReportsCtrl'
      }
    }
  })

相应的报告选项卡HTML可能类似于:

<ion-view view-title="Reports">
  <ion-content ng-controller="ReportsCtrl">

这也会导致控制器运行两次。


AngularJS文档 - ngController
请注意,您还可以通过在$ route服务中声明路由定义来将控制器附加到DOM。 一个常见的错误是在模板中使用ng-controller再次声明控制器。 这将导致控制器被连接并执行两次。

当您将ngRoute与ng-view指令一起使用时,默认情况下控制器会连接到该dom元素(如果您使用ui-router,则会将其连接到该dom元素)。 所以你不需要再在模板中附加它。


我刚刚经历了这个,但问题与接受的答案不同。 我真的在这里留下了我未来的自我,包括我通过修复它的步骤。

  • 删除多余的控制器声明
  • 检查路线中的尾部斜杠
  • 检查ng-ifs
  • 检查任何不必要的包装ng-view电话(我不小心留下在ng-view这是包装我的实际ng-view 。这导致三个电话到我的控制器。)
  • 如果你在Rails上,你应该从你的application.js文件中删除turbolinks gem。 我浪费了一整天的时间来发现这一点。 在这里找到答案。
  • 用ng-app和bootstrap初始化应用程序两次。 对抗AngularJS执行控制器两次
  • 当使用$ compile编译整个元素的'链接' - 指令的功能,也有自己的控制器定义,并通过ng-click等模板使用此控制器的回调。在这里找到答案。
  • 链接地址: http://www.djcxy.com/p/77845.html

    上一篇: Combating AngularJS executing controller twice

    下一篇: How to use a filter in a controller?