我知道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-ui-router和$state。Go ('new_state', {foo: "foo@bar"})

一旦我将encodeURIComponent添加到参数中,问题就解决了:$state。go('new_state', {foo: encodeURIComponent("foo@bar")})。

发生了什么事? 参数值中的“@”字符不允许出现在url中。因此,angular-ui-router创建了我的控制器两次:在第一次创建时,它传递了原始的“foo@bar”,在第二次创建时,它将传递编码版本“foo%40bar”。一旦我像上面那样显式地对参数进行编码,问题就解决了。

其他回答

我的问题是更新搜索参数,比如$location。搜索(“参数”,键);

你可以在这里阅读更多信息

由于在url中添加参数,控制器被调用了两次

我有同样的问题,在尝试了所有的答案后,我终于发现我在我的视图中有一个指令,绑定到相同的控制器。

APP.directive('MyDirective', function() {
  return {
    restrict: 'AE',
    scope: {},
    templateUrl: '../views/quiz.html',
    controller: 'ShowClassController'
}
});

删除指令后,控制器停止被调用两次。现在我的问题是,如何使用这个绑定到控制器作用域的指令而不出现这个问题?

在我的例子中,重命名控制器为不同的名称解决了问题。

控制器名称与“angular-ui-tree”模块有冲突:我将我的控制器从“CatalogerTreeController”重命名为“TreeController”,然后这个控制器开始在“ui-tree”指令使用的页面上初始化两次,因为这个指令使用名为“TreeController”的控制器。

特此补充,以供参考:

在同样运行在页面上的指令中引用控制器也可能导致双控制器代码执行。

e.g.

return {

            restrict: 'A',
            controller: 'myController',
            link: function ($scope) { ....

当你也有ng-controller="myController"在你的HTML

我有同样的问题,在一个简单的应用程序(没有路由和一个简单的ng-controller引用),我的控制器的构造函数运行了两次。最后,我发现我的问题是以下声明自动引导我的AngularJS应用程序在我的Razor视图

<html ng-app="mTest1">

我还使用angular手动引导它。引导。

angular.bootstrap(document, [this.app.name]);

所以去掉其中一个,对我有用。