2014-07-11 16 views
9

Ho visto alcuni exmaples sullo stack overflow su questo problema di ng-init, anche se non riesco a trovarne uno che faccia riferimento ad esso con l'uso di un controller.Angolare: ng-init non funziona a carico

ho chiamato la funzione del controller avendo il seguente nel file html

<div class="tab-container" ng-controller = "ExampleController" ng-init = "init()" > 

Nel controllore:

$scope.init = function(){ 

     alert("do something"); 
}; 

Esso viene eseguito, ma corre prima che i componenti hanno caricato sullo schermo.

Mi manca qualcosa?

Grazie

+0

che è come funziona – Mosho

+0

Lei ha lo stesso problema con un problema qui [inserire descrizione collegamento qui] [1] [1]: http://stackoverflow.com/questions/17104639/ng-init- ng-controller-strange-behavior-in-the-controller-scope – ThomasP1988

+0

Sono perplesso da questa domanda, è un problema che funzioni nel modo in cui hai osservato che funziona (e come è progettato per funzionare?) .. Quale risposta stai cercando oltre a quella che @Mosho ha fornito ??? – Jens

risposta

11

ng-init dovrebbe funzionare in questo modo, perché è utilizzato per inizializzare i dati.

Un esempio molto semplice:

<ul ng-init="list = [1,2,3,4]"> 
    <li ng-repeat="l in list"></li> 
</ul> 

Se si sta tentando di eseguire qualcosa mentre i carichi del controller, in realtà è molto più semplice di quanto si pensava:

app.controller('mainCtrl', function ($scope) { 

    var init = function ($scope) { 
    // do whatever you need to do to initialize your controller 
    $scope.someData = ["Hey", "I'm", "Alive"] 
    $scope.otherData = localStorage.getItem('myBackup') 
    } 

    init() 

}) 

O ancora più semplice, se non hai bisogno della funzione (nessuna chiusura o altro)

app.controller('mainCtrl', function ($scope) { 

    // do whatever you need to do to initialize your controller 
    $scope.someData = ["Hey", "I'm", "Alive"] 
    $scope.otherData = localStorage.getItem('myBackup') 

}) 

Edit - supponendo che stai usando ngView:
avere il codice corsa su quando la pagina è a pieno carico è necessario impostare un osservatore sull'evento $viewContentLoaded, in questo modo:

$scope.$on('$viewContentLoaded', function(){ 
    //Here your view content is fully loaded !! 
    }); 

app.controller('mainCtrl', function ($scope) { 

    // This event is triggered when the view has finished loading 
    $scope.$on('$viewContentLoaded', function() { 

    $scope.someData = ["Hey", "I'm", "Alive"] 
    $scope.otherData = localStorage.getItem('myBackup')  

    })  
}) 
+2

L'utilizzo di ng-init in questo modo può in alcuni casi essere utile per trasportare variabili serveride nel proprio index.html iniziale, ad es. ng-init = "init (@razorVariable)", ovviamente ci sono alternative a questo, ma trovo questo approccio piuttosto pulito in realtà. Lo abbiamo usato un po 'per la transizione di un'app esistente in un'app SPA. Quelli completamente fatti lì probabilmente non saranno così tante cose da inizializzare in questo modo, ma non si può mai veramente escluderlo. – Jens

+0

Grazie a @domokun per la tua risposta, ho provato il secondo metodo che hai menzionato e continua a funzionare prima che il controller abbia impostato completamente tutti i componenti sullo schermo. C'è qualcuno perché posso chiedere di aspettare fino a quando tutto è stato caricato, quindi eseguire il codice di init? –

+0

@AntonHughes Capisco. Dai un'occhiata al codice che ho aggiunto nella mia modifica – domokun

Problemi correlati