我知道AngularJS会将一些代码运行两次,有时甚至更多,比如$watch events,不断检查模型状态等等。

然而我的代码:

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条记录插入到我的DB中。我显然还在学习,因为我已经用我的头撞它很多年了!


当前回答

我在angular-route@1.6.7也有同样的问题,这是因为在regex路由的结尾额外的斜杠:

.when('/goods/publish/:classId/', option)

to

.when('/goods/publish/:classId', option)

而且工作正常。

其他回答

我刚刚讲过这个问题,但这个问题与公认的答案不同。我真的要把这些留给未来的自己,包括我为解决这个问题所采取的步骤。

Remove redundant controller declarations Check trailing slashes in routes Check for ng-ifs Check for any unnecessary wrapping ng-view calls (I accidentally had left in an ng-view that was wrapping my actual ng-view. This resulted in three calls to my controllers.) If you are on Rails, you should remove the turbolinks gem from your application.js file. I wasted a whole day to discover that. Found answer here. Initializing the app twice with ng-app and with bootstrap. Combating AngularJS executing controller twice When using $compile on whole element in 'link'-function of directive that also has its own controller defined and uses callbacks of this controller in template via ng-click etc. Found answer here.

当在Angular 1.3+中使用Angular -ui-router时,有一个关于在路由转换时渲染视图两次的问题。这也导致执行了两次控制器。提出的解决方案没有一个对我有效。

但是,将angular-ui-router从0.2.11更新到0.2.13,为我解决了这个问题。

在我的例子中,我发现使用相同控制器的两个视图。

$stateProvider.state('app', {
  url: '',
  views: {
    "viewOne@app": {
      controller: 'CtrlOne as CtrlOne',
      templateUrl: 'main/one.tpl.html'
    },
    "viewTwo@app": {
      controller: 'CtrlOne as CtrlOne',
      templateUrl: 'main/two.tpl.html'
    }
  }
});

在我的例子中,这是因为我使用的url模式

我的url是/ui/project/:parameter1/:parameter2。

我不需要在所有状态改变的情况下都使用paramerter2。在我不需要第二个参数的情况下,我的url将像/ui/project/:parameter1/。所以每当我有状态改变时,我都会刷新控制器两次。

解决方案是将parameter2设置为空字符串并进行状态更改。

在这个问题上,我把我的应用程序和它所有的依赖项都撕成了碎片(详细信息在这里:AngularJS应用程序初始化两次(尝试了通常的解决方案..))

最后,这都是巴塔朗Chrome插件的错。

这个答案中的决议:

我强烈建议大家在修改代码之前先禁用每一篇文章。