2014-07-11 9 views
9

Ich habe ein paar Examples auf Stack-Überlauf über dieses ng-init Problem gesehen, obwohl ich nicht scheinen kann, einen zu finden, der es mit der Verwendung eines Controllers referenziert.Angular: ng-init läuft nicht unter Last

Ich habe die Funktion in der Steuerung, indem die folgenden in der HTML-Datei

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

Im Controller genannt:

$scope.init = function(){ 

     alert("do something"); 
}; 

Es läuft, aber es läuft, bevor die Komponenten geladen haben auf dem Bildschirm.

Fehle ich etwas?

Dank

+0

, das ist wie es funktioniert – Mosho

+0

Sie das gleiche Problem mit einem Problem hier haben [1] [1] [link Beschreibung hier eingeben]: http://stackoverflow.com/questions/17104639/ng-init- ng-controller-somethy-in-the-controllers-scope – ThomasP1988

+0

Ich bin verwirrt von dieser Frage, ist es ein Problem, dass es so funktioniert, wie Sie beobachtet haben, dass es funktioniert (und wie es entworfen ist zu arbeiten?) .. Welche Antwort suchst du neben dem einen @Mosho zur Verfügung gestellt ??? – Jens

Antwort

11

ng-init soll so arbeiten, weil es zu initialisieren Daten verwendet wird.

Ein sehr einfaches Beispiel:

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

Wenn Sie etwas, während der Controller Lasten versuchen, auszuführen, ist es eigentlich viel einfacher, als Sie dachten:

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

}) 

Oder noch einfacher, wenn Sie brauchen die Funktion nicht (keine Verschlüsse oder was auch immer)

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

}) 

Bearbeiten - vorausgesetzt, Sie verwenden ngView:
auf den Code ausführen zu haben, wenn die Seite vollständig geladen ist Sie ein Beobachter auf der Veranstaltung $viewContentLoaded, wie diese setzen soll

$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

Die Verwendung von ng-init auf diese Weise kann in einigen Fällen nützlich sein, um serverseitige Variablen in Ihren anfänglichen index.html zu transportieren, obwohl z. ng-init = "init (@razorVariable)", offensichtlich gibt es Alternativen dazu, aber ich finde diesen Ansatz eigentlich ziemlich sauber. Wir haben es ziemlich oft benutzt, um eine bestehende App in eine SPA-App umzuwandeln. Es wird wahrscheinlich nicht so viele Dinge geben, die auf diese Weise initialisiert werden, aber man kann dies niemals wirklich ausschließen. – Jens

+0

Vielen Dank @ Domokun für Ihre Antwort, ich habe versucht, die zweite Methode, die Sie dort erwähnt, und es läuft noch, bevor der Controller alle Komponenten auf dem Bildschirm vollständig eingestellt hat. Kann ich es darum bitten, zu warten, bis alles geladen ist, und den Init-Code ausführen? –

+0

@AntonHughes Ich verstehe. Schau dir den Code an, den ich in meiner Bearbeitung hinzugefügt habe – domokun

Verwandte Themen