Czy mogę udostępnić funkcję w każdym kontrolerze kątowym?
191
Jeśli mam funkcję narzędzia foo, do której chcę zadzwonić z dowolnego miejsca w mojej ng-appdeklaracji. Czy jest jakiś sposób, że mogę uczynić go globalnie dostępnym w mojej konfiguracji modułu, czy muszę dodać go do zakresu w każdym kontrolerze?
Nie jestem tego w 100% pewien, ale istnieje szansa, że możesz również zdefiniować go w swoim module w następujący sposób: module.value('myFunc', function(a){return a;});a następnie wstrzyknąć go z nazwy do kontrolerów. (Jeśli ktoś chce uniknąć świadczenia usługi)
DOBRZE. :) Po prostu używam dyrektyw z izolowanym zakresem częściej niż zwykłe kontrolery i i tak muszę wszystko wstrzykiwać. Podoba mi się ten modułowy styl kodu. Ponadto nie musisz w żaden sposób zadzierać z zasięgami nadrzędnymi i nie musisz dużo szukać, skąd pochodzą zmienne zakresu. :)
Zasadniczo masz dwie opcje: albo zdefiniuj ją jako usługę, albo umieść w swoim głównym katalogu. Sugerowałbym, aby zrobić z niego usługę, aby uniknąć zanieczyszczenia zakresu głównego. Tworzysz usługę i udostępniasz ją w kontrolerze w następujący sposób:
Co w pierwszym rozwiązaniu, jeśli jest mnóstwo foo()funkcji? Wykonanie $scope.callFoo()opakowania dla każdego z nich to zbyt wiele pracy. Jak mogę „dołączyć” wszystkie funkcje biblioteki do zakresu, aby można było jej użyć w szablonie? Mam dużą bibliotekę konwersji jednostek, która ma być dostępna w moim szablonie.
Moje pytanie również. Wypróbowałem to i działa: możesz „dołączyć”, mówiąc $scope.callFoo = myService.foo;zamiast tworzyć nowe opakowanie w każdym miejscu, w którym chcesz go użyć.
Dzięki za pomoc, zastanawiałem się, jak udostępnić funkcję zmiany języka w mojej aplikacji, a $ rootScope wykonał to zadanie. Chciałem trzymać moduł tłumaczący poza aplikacją, aby móc go również podłączyć do innych aplikacji.
Sugeruję użycie wartości kątowej zamiast fabryki w tym konkretnym przypadku, chyba że planujesz mieć wiele funkcji w ramach usługi. Jeśli jest to tylko jedna funkcja, uczyń ją wartością.
Chociaż pierwsze podejście jest zalecane jako podejście „kątowe”, czuję, że powoduje to dodatkowe koszty.
Zastanów się, czy chcę użyć tej funkcji myservice.foo w 10 różnych kontrolerach. Będę musiał określić tę zależność „myService”, a następnie właściwość zakresu $ scope.callFoo we wszystkich dziesięciu. Jest to po prostu powtórzenie i w jakiś sposób narusza zasadę OSUSZANIA.
Natomiast jeśli używam metody $ rootScope, tę globalną funkcję określam tylko raz i będzie ona dostępna we wszystkich moich przyszłych kontrolerach, bez względu na to, ile z nich.
Dokumentacja kontrolerów może mieć pewną wartość, skąd biorą to globalne zgłoszenie serwisowe. Gdybyś był szarpnął jednego ze swoich kontrolerów do innej aplikacji, byłoby mniej jasne, skąd pochodzi ta funkcja globalna. Słyszę jednak, że rozumiem twój argument.
Zmienna $ rootScope zawsze ma wartość NULL podczas odświeżania strony, w takim przypadku funkcja nie będzie dostępna. Dlatego dobrze jest wstrzyknąć usługę i skorzystać z jej referencji w aplikacji.
AngularJs ma „ Usługi ” i „ Fabryki ” tylko na takie problemy, jak twoje. Są one używane, aby mieć coś globalnego między kontrolerami, dyrektywami, innymi usługami lub innymi komponentami angularjs. Możesz definiować funkcje, przechowywać dane, wykonywać funkcje obliczeniowe lub cokolwiek innego chcą wewnątrz usług i korzystania z nich w angularjs Components jako globalnego .like
Jestem trochę nowszy od Angulara, ale moim zdaniem użyteczne (i dość proste) jest to, że stworzyłem skrypt globalny, który ładuję na swoją stronę przed skryptem lokalnym ze zmiennymi globalnymi, do których i tak muszę uzyskać dostęp na wszystkich stronach. W tym skrypcie utworzyłem obiekt o nazwie „globalFunctions” i dodałem funkcje, do których muszę mieć dostęp globalnie jako właściwości. np globalFunctions.foo = myFunc();. Następnie w każdym skrypcie lokalnym pisałem $scope.globalFunctions = globalFunctions;i mam natychmiastowy dostęp do dowolnej funkcji dodanej do obiektu globalFunctions w skrypcie globalnym.
Jest to trochę obejścia i nie jestem pewien, czy ci to pomaga, ale zdecydowanie mi pomogło, ponieważ miałem wiele funkcji i dodawanie ich wszystkich na każdej stronie było uciążliwe.
Wydaje mi się to działającym rozwiązaniem. Jedyną rzeczą, którą zalecałbym, aby upewnić się, że twój zakres jest wystarczająco odizolowany, jest utworzenie globalnej klasy root narzędzia JavaScript i zawieszenie na nim metod, abyś nie przypadkowo nadepnął na inną nazwę funkcji w ogromne morze rzeczy wstrzykniętych przez Angulara.
Należy zwrócić uwagę na jedną rzecz i być może dlatego jest to odrzucone, możesz używać tylko tych funkcji w swoich szablonach, a nie modułów .ts, ponieważ wywołania funkcji nie zostaną rozwiązane w czasie kompilacji. To jest powód, aby robić to „kątowo”. Ale jeśli chcesz tylko dodać dekoratory i tym podobne do swoich szablonów, globalny plik narzędziowy jest prosty i w porządku.
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
module.value('myFunc', function(a){return a;});
a następnie wstrzyknąć go z nazwy do kontrolerów. (Jeśli ktoś chce uniknąć świadczenia usługi)