2013-09-05 5 views
9

Ho una direttiva "ng-init" nel mio codice HTML che inizializza il valore di "data.id" nel mio modello di dati Angular.js. Diciamo per ora che non posso cambiare il modo in cui funziona.Qual è il modo giusto per attendere che i valori di ng-init siano impostati?

Ora, voglio fare una richiesta HTTP non appena i miei caricamento della pagina, in cui l'URL dipenderà questo valore data.id. Finora, il seguente sembra funzionare:

app.controller('MainCtrl', function ($scope, $http, $timeout) { 
    "use strict"; 

    $scope.data = {}; 

    $timeout(function() { 
    $http.get("/api/Something?id=" + $scope.data.id); 
    }, 0); 
}); 

Tuttavia, utilizzando un timer con un timeout pari a zero sembra goffo. (E se tralascio il codice $ timeout e semplicemente chiamare $ http.get direttamente, quindi $ scope.data.id è, naturalmente, non definito).

Esiste un modo migliore per aspettare fino a ng-init ha eseguito prima di emettere la richiesta $ http? E il codice basato sul timeout sopra garantito funziona in tutti i casi/su tutti i browser, ecc.?

+0

vorrei suggerire il modello o del controller alla ricerca dopo i dati e la vista solo riflette i dati, non impostazione. questo è un approccio molto più "angolare" imho – Anton

risposta

5

Si può provare a utilizzare un orologio

$scope.$watch('data.id',function(newValue,oldValue) { 
    if(newValue) { 
    $http.get("/api/Something?id=" + $scope.data.id); 
    } 
}); 
+0

Grazie! Questo sembra funzionare e ho accettato la risposta. Io sono curioso però se c'è una risposta alla seconda parte della mia domanda (se ho mantenuto il codice $ timeout, è esso garantito il funzionamento o lo fa solo capita di lavorare?) –

+0

Date un'occhiata a questa discussione su SO. http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful#comment14183689_779785. Spero che ti aiuti :) Potrebbe non funzionare se c'è un ritardo sostanziale. – Chandermani

+0

ma questa cosa scatterà ogni volta che cambia data.id, non solo sul pugno init, non è vero? – Serge