AngularJS应用程序启动两次(尝试通常的解决方案..)

时间:2015-05-06 15:55:43

标签: javascript angularjs

已解决:

此处的决议: https://stackoverflow.com/a/29662815/4004456

Batarang Chrome插件两次点击所有ng-click操作。我的代码没有错.Batarang欠我一个下午......

注意:我尝试了所有修复:Combating AngularJS executing controller twice

编辑:令人费解的事情:

似乎所有控制器都被初始化了两次,因为哪个视图调用哪个函数并不重要,它被触发了两次,这就是让我相信它是app.js文件中的问题.. < / p>

编辑:我尝试过的决议:

  • 我尝试逐个删除bower依赖项以排除导致它的依赖关系。
  • 我已经搜索了我的代码以获得双控制器初始化(在index.html中,然后再在div / bootstrap初始化中。)
  • 我已经逐一删除了我的自定义指令,以确保&#34;限制:&#34; /控制器重复没有发生。
  • 我已从应用程序中删除了所有ng-if语句。
  • 搜索所有html以获取重复的ng-view / ui-view等。
  • 尝试了具有和不具有尾部斜杠的路线+链接的所有组合。

然而,我的问题几乎与上述问题相同,我的控制器在按钮点击时两次触发功能。

我试图设置一个plunkr,但代码太复杂了,我无法正常工作..我已经从下面的代码中删除了任何臃肿。 index.html

<section ng-show="!stateIsLoading"> <div ng-view></div></section>
<section class="colorful" ng-hide="!stateIsLoading">
    <three-bounce-spinner></three-bounce-spinner>
</section>

app.js

    'use strict';

/**
 * @ngdoc overview
 * @name smcmsApp
 * @description
 * # smcmsApp
 *
 * Main module of the application.
 */
angular
    .module('smcmsApp', [
    'ngAnimate',
    'ngAria',
    'ngCookies',
    'ngMessages',
    'ngResource',
    'ngRoute',
    'ngSanitize',
    'ngTouch',
    'ui.bootstrap',
    'angular-spinkit',
    'restangular'
  ])
    .config(function ($routeProvider, RestangularProvider) {
        $routeProvider
            .when('/', {
                templateUrl: 'views/main.html',
                controller: 'MainCtrl'
            })
            .when('/about', {
                templateUrl: 'views/about.html',
                controller: 'AboutCtrl'
            })
            .when('/sales', {
                templateUrl: 'views/sales.html',
                controller: 'SalesCtrl',
                resolve: {
                    mailers: function (API) {
                        return API.mailers.getList();
                    },
                    totals: function (Restangular) {
                        return Restangular.all('profit').customGET();
                    }
                }
            })
            .when('/design', {
                templateUrl: 'views/design.html',
                controller: 'DesignCtrl',
                resolve: {
                    design: function (API) {
                        return API.design.getList();
                    }
                }
            })
            .otherwise({
                redirectTo: '/'
            });
        RestangularProvider.setBaseUrl('http://localhost/SMCMS_Angular/api/Slim/');
    })
    .run(function ($rootScope, $log) {
        $rootScope.stateIsLoading = false;
        $rootScope.$on('$routeChangeStart', function () {
            console.log("route change start");
            $rootScope.stateIsLoading = true;
        });
        $rootScope.$on('$routeChangeSuccess', function () {
            console.log("route change success");
            $rootScope.stateIsLoading = false;
        });
        $rootScope.$on('$routeChangeError', function () {
            //catch error
            console.log("Route changing animation error");
        });
});

DesignCtrl.js

angular.module('smcmsApp')
    .controller('DesignCtrl', function ($scope, $log, design, Notifications, Data) {
        /* ------------------------- Order Interactions  --------------- */
        $scope.saveOrder = function (order) {
            Notifications.addAlert('error', 'called showModal() from design.js');
            $log.debug("called showModal() from design.js");
        };
});

views / design.html

<label ng-click="saveOrder(order)" class="btn btn-default">Save Details  <span class="glyphicon glyphicon-floppy-open"></span>

1 个答案:

答案 0 :(得分:0)

我认为问题在于初始化期间app处理的方式。如果您导航到您的应用程序http://example.com/,那么您的网址将是一个空字符串并触发路由更改。在无法解决之后,它将点击其他方式并导致双路径更改/初始化。

基本上,如果您在加载时自行启动路线,则不应看到双重更改。您可以注入$location服务并在运行中直接指向您,假设您想要从任何一个给定点开始。 (见插件:http://plnkr.co/edit/lTOSYX?p=preview

.run(function ($rootScope, $log, $location) {
    $location.path('/');//Add this
    // continue code here
});

如果您的控制器是双重加载,那么您可能还有其他复杂情况,例如注释(Combating AngularJS executing controller twice)中提到的双控制器声明/执行问题。