2014-07-11 16 views
9

Widziałem kilka przykładów na przepełnienie stosu w związku z tym problemem ng-init, chociaż nie mogę znaleźć takiego, który odwołuje się do niego za pomocą kontrolera.Angular: ng-init nie działa przy obciążeniu

nazwałem funkcję w kontrolerze poprzez następujące w pliku html

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

w kontrolerze:

$scope.init = function(){ 

     alert("do something"); 
}; 

To nie uciekać, ale ona biegnie przed składniki zostały załadowane na ekranie.

Czy brakuje mi czegoś?

Dzięki

+0

który jest jak to działa – Mosho

+0

masz ten sam problem z problemem tutaj [enter opis Link tutaj] [1] [1]: http://stackoverflow.com/questions/17104639/ng-init- ng-controller-strange-behaviour-in-the-controllers-scope – ThomasP1988

+0

Jestem zaskoczony tym pytaniem, czy jest to problem, który działa w sposób, w jaki zauważyłeś, że działa (i jak jest zaprojektowany do pracy?). Jakiej odpowiedzi szukasz poza tym dostarczonym przez @Mosho? – Jens

Odpowiedz

11

ng-init ma działać w ten sposób, ponieważ jest on używany do inicjalizacji danych.

bardzo prosty przykład:

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

Jeśli próbujesz uruchomić coś czasie, gdy obciążenia regulatora, to faktycznie dużo prostsze niż myślisz:

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() 

}) 

Albo jeszcze prościej, jeśli nie potrzebujesz tej funkcji (żadnych zamknięć ani żadnych innych)

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 - zakładając używasz ngView:
Aby mieć uruchomić kod na, gdy strona jest w pełni załadowany należy ustawić obserwatora na razie $viewContentLoaded, tak:

$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

Użycie polecenia ng-init może w niektórych przypadkach przydać się do przeniesienia zmiennych serwerowych do początkowego pliku index.html, np. ng-init = "init (@razorVariable)", oczywiście istnieją alternatywy do tego, ale uważam, że to podejście jest raczej czyste. Zużyliśmy go trochę, przekształcając istniejącą aplikację w aplikację SPA. W pełni wykonane tam prawdopodobnie nie będzie tyle rzeczy do zainicjowania w ten sposób, ale nigdy naprawdę nie można tego wykluczyć. – Jens

+0

Dziękuję @domokun za odpowiedź, próbowałem drugiej metody, o której wspomniałeś, i nadal działa, zanim kontroler w pełni ustawi wszystkie komponenty na ekranie. Czy jest cokolwiek, mogę poprosić o czekanie, aż wszystko się załaduje, a następnie uruchomić kod init? –

+0

@AntonHughes Rozumiem. Zajrzyj do kodu, który dodałem w mojej edycji – domokun

Powiązane problemy