2013-09-05 30 views
9

Mam w moim kodzie HTML dyrektywę "ng-init", która inicjuje wartość "data.id" w moim modelu danych Angular.js. Powiedzmy na razie, że nie mogę zmienić sposobu działania.Jaki jest właściwy sposób oczekiwania na wartości ng-init?

Teraz chcę utworzyć żądanie HTTP zaraz po załadowaniu strony, gdzie adres URL będzie zależał od tej wartości data.id. Do tej pory wydaje się, że działa:

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

    $scope.data = {}; 

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

Jednak korzystanie z licznika czasu z limitem czasu zero wydaje się nieporęczne. (A jeśli pominę kod $ timeout i po prostu zadzwonię bezpośrednio do $ http.get, to $ scope.data.id jest, oczywiście, niezdefiniowany).

Czy istnieje lepszy sposób oczekiwania na wykonanie polecenia ng-init przed wysłaniem żądania $ http? I czy powyższy kod oparty na limicie czasu gwarantuje działanie we wszystkich przypadkach/we wszystkich przeglądarkach itp.?

+0

proponuję model lub kontroler patrząc po danych i widok po prostu odzwierciedla dane, nie ustawiając go. to jest o wiele bardziej "kątowe" podejście imho – Anton

Odpowiedz

5

Można spróbować użyć zegarka

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

Dzięki! Wydaje się to działać i zaakceptowałem odpowiedź. Ciekawi mnie jednak, czy istnieje odpowiedź na drugą część mojego pytania (czy zachowałem kod $ timeout, czy jest on gwarantowany do działania czy po prostu działa?) –

+0

Spójrz na tę dyskusję na temat SO. http://stackoverflow.com/questions/779379/why-is-settimeoutfn-0-sometimes-useful#comment14183689_779785. Mam nadzieję, że ci to pomoże :) Może nie działać, jeśli występuje znaczne opóźnienie. – Chandermani

+0

ale ta rzecz będzie się uruchamiać za każdym razem, gdy zmieni się data.id, nie tylko na pierwszym instrumencie, prawda? – Serge