L'application AngularJS a débuté deux fois (a essayé les solutions habituelles …)

RÉSOLU:

Résolution ici: https://stackoverflow.com/a/29662815/4004456

Le plugin Batarang Chrome a déclenché toutes les actions ng-click deux fois. Rien de mal avec mon code … Batarang me doit un après-midi …

REMARQUE: J'ai tenté toutes les corrections dans: Combattre AngularJS exécutant le contrôleur deux fois

EDIT: quelque chose d'étonnant:

Il semble que tous les contrôleurs soient initialisés à deux reprises, car cela n'a aucune importance sur les appels de visualisation qui fonctionnent, il se lance deux fois, c'est ce qui m'a amené à croire que c'est un problème dans le fichier app.js.

EDIT: résolutions que j'ai tenté:

  • J'ai essayé de supprimer les dépendances de bower une par une pour exclure une dépendance qui l'a causé.
  • J'ai parcouru mon code pour l'init de contrôleur double (à la fois dans index.html, puis à nouveau dans une initialisation div / bootstrap).
  • J'ai supprimé mes directives personnalisées un par un pour s'assurer que la duplication de "restreindre:" / contrôleur ne se produit pas.
  • J'ai supprimé toutes les instructions ng-if de l'application.
  • Scoured tout html pour une double vue / ui-view, etc.
  • Essayé toutes les combinaisons de routes + liens ayant et n'ayant pas de barres obliques.

Mon problème, cependant, est presque identique à la question ci-dessus, mes contrôleurs fonctionnent deux fois à l'aide du bouton.

J'ai essayé de configurer un plunkr, mais le code est trop complexe pour que je fonctionne correctement … J'ai effacé tous les effets du code ci-dessous. 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> 

Je crois que le problème réside dans la façon dont l'application gère pendant l'initialisation. Si vous naviguez vers votre application http://example.com/ alors votre url sera une chaîne vide et déclenchera le changement d'itinéraire. Une fois qu'il ne parvient pas à le résoudre, il sera alors remplacé par le contraire et provoquera la double modification / initialisation de l'itinéraire.

Fondamentalement, si vous déclenchez la route vous-même lors de la charge, vous ne devriez pas voir le double changement. Vous pouvez simplement injecter le service de $location et diriger vous-même à l'intérieur de la course en supposant que vous voulez commencer à n'importe quel point donné. (Voir le plunk: http://plnkr.co/edit/lTOSYX?p=preview )

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

Si vos contrôleurs sont à double charge, vous avez probablement d'autres complications, comme le problème de déclaration / exécution double contrôle mentionné dans la note ( Combattre le contrôleur d'exécution AngularJS deux fois ).