Czy przekazywanie „prądu” $scope
do usługi AngularJS jest prawidłowe ?
Jestem w sytuacji, w której mam usługę $, wiedząc, że jest używana tylko przez jeden kontroler, i chciałbym mieć odniesienie do zakresu kontrolera w samych metodach $ service.
Czy jest to filozoficznie poprawne?
A może lepiej byłoby transmitować zdarzenia do $ rootScope, a następnie kazać kontrolerowi ich słuchać?
$scope
właściwości i dzwonić w$scope.$apply
razie potrzeby.$scope
... w jaki sposób administrator miałby bezpośrednio uzyskać dostęp do danych w serwisie i przekazać je do widoku bez robienia tego?Odpowiedzi:
Aby powiadomić kontroler, gdy dzieje się coś asynchronicznego, użyj obietnic Angular .
Aby sprowokować
$apply
, nie potrzebujesz zakresu, możesz wywołać$rootScope.$apply
, ponieważ nie ma różnicy wywoływanie go w określonym zakresie lub w katalogu głównym.Odnośnie odczytu zmiennych byłoby lepiej, gdybyś otrzymał parametry. Ale możesz również odczytać to z zakresu jako parametr obiektu, ale użyłbym parametru, który sprawiłby, że interfejs usługi byłby znacznie bardziej przejrzysty.
źródło
$scope
przez wywołanie usługi przy użyciuexecuteSql()
funkcji asynchronicznej . Patrząc na 3 opcje (1) użyj wywołania zwrotnego w funkcji async, a następnie wywołaj$scope.$apply
... to działa, ale jest brzydkie (2) przejdź$scope
do funkcji asynchronicznej, a następnie wywołajtheScope.$apply()
... to również działa (3) użyj obietnicy. ..nie próbowałem tego jeszcze. Dlaczego obietnica jest najlepszym sposobem? Dzięki!Powiedziałbym, że jeśli twoja funkcjonalność jest specyficzna tylko dla jednego kontrolera, nie potrzebujesz usługi.
Zadaniem kontrolerów jest manipulowanie określonym modelem, podczas gdy usługa powinna zajmować się zadaniami globalnymi. Wolałbym raczej trzymać się tego paradygmatu, zamiast mieszać rzeczy.
Tak mówią doktorzy
Usługa
Kontroler
PS: Oprócz tego, jeśli chcesz przetrawić, możesz również wstrzyknąć $ rootScope w ramach swojej usługi.
źródło
$apply
lub$digest
do $ rootScope ma dla mnie całkowicie sens.Tak. Możesz przekazać $ scope do usługi podczas jej inicjalizacji. W konstruktorze usługi możesz przypisać zakres do czegoś takiego jak this._scope, a następnie odwołać się do zakresu w ramach usługi!
źródło
$scope
każdym razem, gdy dany kontroler wstrzykuje usługę - aby nie musieć wywoływać metody w usłudze i ręcznie$scope
do niej przechodzić .new MyFunction()
). Pytanie dotyczyło usługi, w której dzwonienienew
nie wchodzi w grę.Osobiście uważam, że przejście
$scope
do usługi jest złym pomysłem , ponieważ tworzy coś w rodzaju cyrkularnego odniesienia: kontroler jest zależny od usługi, a usługa zależy od zakresu kontrolera.Oprócz tego, że są zagmatwane pod względem relacji, rzeczy takie jak ten w końcu przeszkadzają odśmiecaczowi.
Preferowanym podejściem jest umieszczenie obiektu domeny w zakresie kontrolera i przekazanie go do usługi. W ten sposób usługa działa niezależnie od tego, czy jest używana wewnątrz kontrolera, czy może w przyszłości w innej usłudze.
Na przykład, jeśli usługa ma wypychać i zdejmować elementy z tablicy
errors
, mój kod będzie wyglądał następująco:Usługa współdziała wtedy ze sterownikiem, działając na
errors
. Oczywiście muszę być ostrożny, aby nigdy nie wymazać całego odniesienia do tablicy, ale pod koniec dnia jest to ogólny problem JS.Nigdy nie chciałbym używać transmisji
$apply
i / lub podobnych rzeczy, ponieważ imho dobre praktyki OO zawsze będą ważniejsze od jakiejkolwiek magii Angulara.źródło
$scope.errors = []; $scope.myService = new MyService($scope.errors);
errors
żyje niezależnie od$scope
. O to właśnie chodzi w tej odpowiedzi. Pls sprawdź link, który podałem w tekście. Twoje zdrowie.$scope.errors
wskazujevar errors
, a błędy zmiennej wydają mi się zbędne, ponieważ to tylko kolejny wskaźnik. Jeden Podobna sytuacja mogę myśleć i że jest to rażąco zbędny jest ten kawałek kodu:const errors = errors2 = errors3 = []; $scope.errors = errors;
. Czy zgadzasz się, że tylko podany przez Ciebie fragment kodu wydajevar errors = []
się zbędny?errors
żyje niezależnie od$scope
. Musisz zrozumieć, czym jest obiekt domeny, a także czym jestvar
przypisanie. Jeśli podany przeze mnie link nie wystarczy, dostępnych jest wiele innych materiałów.MyService(errors)
. W moim rozumieniu usługa powinna generować tablicę rejestracyjną na podstawie parametru (czyli w tym przypadku wskaźnika). Dla mnie to zły wzorzec, ponieważ usługi są singletonami pod kątem. Jeśli implementacja usługi jest dobrze zaprogramowana, powinna wygenerować tablicę w zmiennej wewnętrznej (aby nadal była singletonem). Dlatego nie ma sensu inicjowanie zmiennej poza usługą.