2012-12-29 24 views
9

angularjs docs say:angularjs obiecują

$ q obietnice są rozpoznawane przez silnik szablonów w kanciaste, co oznacza, że ​​w szablonach można traktować obietnice załączone do zakresu, jak gdyby były otrzymane wartości.

Czy ktoś mógłby wyjaśnić, dlaczego ten fiddle nie działa? Nie można zmienić wartości pola tekstowego. Ale przypisywanie obietnic, że usługa $ http wraca do pola zasięgu działa jak urok.

Kontroler:

function MyController($scope, $q, $timeout) { 
    this.getItem = function() { 
     var deferred = $q.defer(); 
     deferred.resolve({ 
      title: 'Some title' 
     }); 
     return deferred.promise; 
    }; 

    $scope.item = this.getItem(); 
} 

HTML:

<input type="text" ng-model="item.title"> 
+0

Czy możesz pokazać mi, w jaki sposób przypisałeś obietnicę zwróconą przez $ http, który działał tak, jak chciałeś? – Dogbert

+0

@Dogbert, Oto pseudokod dla zilustrowania tego, o czym mówiłem: '$ scope.item = $ http ({method: 'post', url: '/ find/my/item /'}) .then (function (response) { return response.item; }); ' Inny przykład, który używa podejścia $ resource można znaleźć w tym [tutorialu] (http://docs.angularjs.org/tutorial/step_11). Począwszy od linii: 'Zauważ, jak w PhoneListCtrl wymieniliśmy ... z $ scope.phones = Phone.query();' –

+0

Ups, właśnie utworzono [przykład testowy] (http://plnkr.co/edit/ VP1Td3WtdM0E7n5HJH3W? P = preview) i wygląda na to, że nie działa z żadną obietnicą. –

Odpowiedz

14

trzeba użyć funkcji następnie() na obiekcie Obiecujemy:

this.getItem().then(function(result) { 
    $scope.item = result; 
}); 

W twoim przypadku Nie sądzę, że potrzebujesz profesjonalisty Mise. System Angular za $ watch zajmie się sprawami. Just return an object in your function, not a primitive type:

this.getItem = function() { 
    var item = {}; 

    // do some async stuff 
    $http.get(...).success(function(result) { 
     item.title = result; 
    }); 
    return item; 
}; 

$scope.item = this.getItem(); 
+0

Wiem co masz na myśli. Zaktualizowałem swoją odpowiedź. Musisz pozwolić, by kątowe zajmowało się tym (zrobi to automatycznie dzięki systemowi $ watch). – asgoth

+0

Drugi podany przykład nie wygląda na prostszy niż pierwszy;) Poza tym nie będzie działać zgodnie z oczekiwaniami, ponieważ funkcja $ http.get() zostanie rozwiązana z json reprezentującym _item_, a nie tylko _title_ Tak ' this.getItem(). then (function (result) { $ scope.item = result; }); 'wygląda całkiem do zaakceptowania (właśnie zmieniłem this.item = result na $ scope.item = result) –

+0

Ah, istotnie że powinien to być zakres. Zmienię to, abyś mógł to zaakceptować. – asgoth

1

Wierzę powodem Twoja pierwsza skrzypce nie działa dlatego, że są zasadniczo właściwość wiązania zakres item do obietnicy. Gdy próbujesz zmienić wartość, wpisując w polu tekstowym, kątowe odnotowuje aktywność, a następnie ponownie przydziela/resetuje wartość item do wyniku obietnicy (która się nie zmieniła).

Rozwiązanie dostarczone przez @asgoth ustawia/przypisuje wartość item raz, gdy obietnica zostanie rozwiązana. Nie ma tu żadnego wiązania (tzn. item nie jest związane z obietnicą), więc zmiana wartości poprzez pole tekstowe zmienia wartość.

-1

To jest jak @Mark powiedział, tutaj można znaleźć Working Example z twojego fragmentu.

Zasadniczo zwróciłeś obiekt i nie wiążesz samego modelu.

$timeout(function(){ 
    $scope.item = { 
     title: 'Some title' 
    }; // Apply the binding 
    deferred.resolve(); // Resolve promise 
},2000); // wait 2 secs   
+0

Ostatni wiersz twojego JavaScriptu powinien prawdopodobnie po prostu być 'this.getItem();'. –