2013-10-26 17 views
14

Sono nuovo di angolare js e attualmente bloccato con un tipo di errore molto cablato. la funzione in un controller viene eseguita due volte quando viene richiamata dalla vista caricata su una rotta.funzione chiamata due volte all'interno del controller angularjs

http://jsfiddle.net/4gwG3/5/

vedrete avviso due volte !!

mio punto di vista è semplice

e il mio codice app sta seguendo

var IB = angular.module('IB', []);  

//channel controller 
IB.controller('channelsController', function ($scope, $routeParams) { 
    $scope.greet = function() { 
     alert('hi'); 
    }; 
}); 


IB.config(function ($routeProvider) { 
    $routeProvider 
    .when('/channels', { 
     controller: 'channelsController', 
     template: '{{greet()}}' 
    }) 

    .otherwise({ redirectTo: '/channels' }); 

}); 
+0

necessario leggere i cicli di digest ... possono essere chiamati numerose volte. Aiuterebbe a spiegare cosa si desidera ottenere – charlietfl

risposta

37

Prima verifica di non inizializzare l'applicazione Angular due volte (inizializzandola automaticamente con ng-app).

Una volta ho avuto 2 pagine html con ng-app (uno per login.html e un altro per main.html) e questo era un problema che ho capito più tardi.

Seconda e per me la più importante, controllare se sono stati associati il ​​controller a più elementi. Questo è un caso comune se si utilizza il routing .

Nel mio caso ho navigava a DashboardController in questo modo:

app.config(function($routeProvider){ 
    $routeProvider 
    .when('/', { 
     controller: 'DashboardController', 
     templateUrl: 'pages/dashboard.html' 
    }) 
}); 

ma ho avuto anche questo in dashboard.html:

<section class="content" ng-controller="DashboardController"> 

Quale stava istruendo AngularJS per digerire il mio controller due volte.

Per risolverlo ci sono due modi:

rimozione ng-Controller dal file HTML in questo modo:

<section class="content"> 

o la rimozione regolatore dal routing (che normalmente trova in app .js):

app.config(function($routeProvider){ 
$routeProvider 
     .when('/', { 
      templateUrl: 'pages/dashboard.html' 
     }) 
    }); 
3

Penso che con la creazione di un'interpolazione {{greet()}}, si crea un orologio sulla funzione greet. Questa funzione è in grado di richiamare tutte le volte che viene eseguito il ciclo di digest, quindi non è una domanda su di esso in esecuzione 1 o 2 volte. Quindi non dovresti dipendere dai tempi in cui viene chiamata la funzione.

+1

, quindi è possibile per favore fatemi sapere come può una vista chiamare una funzione all'interno del suo controller. e quando il controller può chiamare una funzione una volta caricata la vista? – najam

+0

Si sta già chiamando una funzione del controller all'interno della vista, ed è perfettamente corretto farlo. L'unica cosa che sto dicendo è che non puoi dipendere da come possono essere invocate volte le funzioni. Non ho capito la tua seconda parte. Consiglio vivamente di consultare la guida per sviluppatori http://docs.angularjs.org/guide/concepts – Chandermani

+0

Desidero che la vista richieda una funzione definita nel controller una sola volta? il secondo modo sarebbe il controller per sapere che la vista è caricata in modo che possa chiamare alcune funzioni che rendono costose le chiamate come il caricamento di un web player con streaming live. – najam

0

Non so cosa stai cercando di ottenere qui. Vi sono due avvisi 1. Quando viene chiamato il numero controller. 2. Quando viene valutato l'template.

template è quello di fornire la parte vista, tuttavia, in questo caso il modello è solo la funzione di valutazione che non sta creando alcuna vista.

-3

Ho avuto lo stesso problema, così ho fatto:

$scope.init=function() 
{ 
    if ($rootScope.shopInit==true) return; 
    $rootScope.shopInit=true; 
    ... 
} 
$scope.init(); 

Come se si trattasse di un Singleton! (Avevo molte chiamate Ajax ogni volta che visualizzo, era noioso)

Problemi correlati