Czytałem ten artykuł: http://eviltrout.com/2013/06/15/ember-vs-angular.html
I powiedział:
Z powodu braku konwencji zastanawiam się, ile projektów Angular opiera się na złych praktykach, takich jak wywołania AJAX bezpośrednio w kontrolerach? Czy z powodu wstrzykiwania zależności programiści wprowadzają parametry routera do dyrektyw? Czy początkujący programiści AngularJS zamierzają ustrukturyzować swój kod w sposób, który zdaniem doświadczonego programisty AngularJS jest idiomatyczny?
W rzeczywistości $http
wykonuję połączenia z kontrolera Angular.js. Dlaczego jest to zła praktyka? Jaka jest zatem najlepsza praktyka wykonywania $http
połączeń? i dlaczego?
Odpowiedzi:
EDYCJA: Ta odpowiedź dotyczyła głównie wersji 1.0.X. Aby uniknąć nieporozumień, zmieniono go, aby odzwierciedlał najlepszą odpowiedź dla WSZYSTKICH aktualnych wersji Angular na dzień dzisiejszy, 05.12.2013.
Chodzi o to, aby utworzyć usługę, która zwraca obietnicę zwracanych danych, a następnie wywołać ją w kontrolerze i obsłużyć tam obietnicę, aby zapełnić twoją właściwość $ scope.
Obsługa
Kontroler:
Zajmij się
then()
metodą obietnicy i wyciągnij z niej dane. Ustaw właściwość $ scope i zrób wszystko, co może być konieczne.Rozwiązanie In-View Promise (tylko 1.0.X):
W Angular 1.0.X, który jest celem pierwotnej odpowiedzi tutaj, obietnice zostaną potraktowane w specjalny sposób przez Widok. Po rozstrzygnięciu ich rozstrzygnięta wartość zostanie powiązana z widokiem. W wersji 1.2.X jest to przestarzałe
źródło
$scope.foos
właściwości w szablonie. Gdybyś miał użyć tej samej właściwości poza szablonem (na przykład w innej funkcji), przechowywany tam obiekt nadal jest obiektem obietnicy..then()
z obietnicą i umieścić wartość w $ scope ...myService.getFoos().then(function(value) { $scope.foos = value; });
Najlepszą praktyką byłoby przeniesienie
$http
wywołania do „usługi”, która dostarcza dane Twojemu administratorowi:Abstrahowanie
$http
wywołania w ten sposób umożliwi ponowne użycie tego kodu na wielu kontrolerach. Staje się to konieczne, gdy kod, który wchodzi w interakcję z tymi danymi, staje się bardziej złożony, być może chcesz przetworzyć dane przed użyciem ich w kontrolerze i zapisać wynik tego procesu w pamięci podręcznej, abyś nie musiał tracić czasu na ich ponowne przetwarzanie.Powinieneś myśleć o „usłudze” jako o reprezentacji (lub modelu) danych, z których może korzystać Twoja aplikacja.
źródło
Zaakceptowana odpowiedź dawała mi
$http is not defined
błąd, więc musiałem to zrobić:Główną różnicą jest ta linia:
źródło
Umieściłem odpowiedź dla kogoś, kto chciał mieć całkowicie ogólną usługę internetową w Angular. Zalecam po prostu podłączenie go, a zajmie się wszystkimi wywołaniami usług internetowych bez konieczności kodowania ich wszystkich samodzielnie. Odpowiedź jest tutaj:
https://stackoverflow.com/a/38958644/5349719
źródło