AngularJS i jego wykorzystanie zmiennych dolarowych


129

Czy ktoś wie, czy powodem użycia metod i zmiennych dolarowych w angularJS jest poinstruowanie angularJS, aby unikał sprawdzania tych wartości, gdy trwa trawienie? Tak więc, jeśli pojawi się angular $scope.$valuei $scope.value, to uniknie sprawdzenia tego pierwszego, ponieważ jest poprzedzony znakiem dolara w nazwie zmiennej?


Zobacz także ten wpis na blogu, dotyczący różnicy między „$ scope” i „scope” w angularjs ...
MarcoS

19
Angular prawdopodobnie próbuje zabrać $ z jQuery.
daniel1426

Ten link przekierowuje do strony, która nie wyjaśnia zbyt wiele na temat $ scope.
Paul Brannan

5
Dokumentacja dotycząca dyrektywy - kontroler ma $scope, ale dyrektywa ma scope. WTF?
LeeGee

Odpowiedzi:


88

Jest kilka razy, gdy Angular ignoruje zmienne poprzedzone znakiem dolara:

  1. W komentarzu Schumli poniżej, gdzie filtry json nie wyświetlą ich
  2. Podczas korzystania z {{ }}dyrektywy angular nie pokaże zagnieżdżonych $ zmiennych. Na przykład to wyświetla tylko visiblewłaściwość.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
    
  3. Dodatkowo, podczas dodawania jawnego obserwatora do obiektu zakresu, zmiany właściwości z wiodącym znakiem dolara tego obiektu nie będą wyzwalać obserwatora. Zobacz to zaktualizowane skrzypce .

  4. angular.equals() ignoruje klucze z prefiksem$ .


Wygląda na to, że masz rację. Nawet w przypadku kliknięć i tak dalej, to się zmienia. Dziękuję Ci.
matsko

7
Istnieją pewne części Angulara, które ignorują właściwości z prefiksem, na przykład filtr „json” nie wyświetli zmiennej zaczynającej się od „$”.
Schmuli

116

To tylko konwencja nazewnictwa z poniższego fragmentu http://docs.angularjs.org/tutorial/step_05

Konwencja nazewnictwa prefiksów „$”
Możesz tworzyć własne usługi i faktycznie zrobimy to dokładnie w kroku 11. Zgodnie z konwencją nazewnictwa wbudowane usługi kątowe, metody Scope i kilka innych kątowych interfejsów API mają przedrostek „$” przed nazwą. Nie używaj prefiksu „$” podczas nazywania usług i modeli, aby uniknąć ewentualnych kolizji nazw.

http://docs.angularjs.org/guide/concepts#angular_namespace

Angular Namespace
Aby zapobiec przypadkowej kolizji nazw, Angular przedrostki nazw obiektów, które mogą potencjalnie kolidować z $. Nie używaj prefiksu $ w swoim kodzie, ponieważ może on przypadkowo kolidować z kodem Angular.


2
Dlaczego dokument dyrektywy [1] ma $scopew kontrolerze, ale scopew dyrektywie? --- [1] docs.angularjs.org/guide/directive
LeeGee

2
@LeeGee To tylko konwencja. stackoverflow.com/a/19289054/114558
rinogo

30

$Przedrostek oznacza zmienną, parametr lub właściwość sposobu, który należy do rdzenia kątowych.

Właściwości obiektów, które pochodzą z frameworka, ale w rzeczywistości nie są częścią API, mogą zaczynać się od $- a nawet $$- oznaczać prywatną metodę lub właściwość. W ten sam sposób _przedrostek jest często używany w innych bibliotekach.

Nie ma to żadnego wpływu na sposób, w jaki kod jest interpretowany przez środowisko wykonawcze, chociaż sam framework może nadać mu specjalne znaczenie. Zasadniczo jest to konwencja nazewnictwa, która mówi: „Nie powinieneś z tym bawić”.


Myślę, że źle zrozumiałeś. Środowisko wykonawcze nie przejmuje się nazwami zmiennych. Można to nazwać $$__$_$- to tylko identyfikator bez specjalnego znaczenia dla tłumacza.
dalgard

Dodałem kilka słów, aby podkreślić różnicę między środowiskiem wykonawczym a frameworkiem; bądź tak uprzejmy, aby zmienić swój głos.
dalgard

7

Nie jestem do końca pewien, ale uważam, że wewnętrzne funkcje AngularJS polegają na manipulowaniu tymi zmiennymi z prefiksem $ podczas podsumowania. Sprawdzenie tych zmiennych oznaczałoby, że podsumowanie nigdy się nie ustabilizuje, ponieważ mogą się one stale zmieniać podczas każdego cyklu podsumowania.

Nie cytuj mnie jednak. :)


10
Negocjowany z powodu: „Nie cytuj mnie w tym”. Przykro mi, ale odpowiedź, która przyznaje się do niepewności, nie jest zbyt przydatna :(
David Rivers

2
Głos przeciw przekonwertowany na pozytywny. Zakładając, że masz rację, jest to teraz przydatna odpowiedź!
David Rivers

2
@DavidRivers, jeśli odpowiedź była początkowo niepewna, przeformułowanie jej nie uczyni jej bardziej użyteczną. W rzeczywistości odpowiedź może być błędna, a brak wahania potwierdziłby potencjalny błąd . Zamiast tego, aby tę odpowiedź można było uznać za przydatną, należy ją poprzeć pewnym dowodem, przytaczając zaufane źródła lub dostarczać skrzypiec do odtworzenia wyrażonych punktów.
Ivaylo Slavov

1
@IvayloSlavov: Całkowicie się z tobą zgadzam. Założyłem (prawdopodobnie błędnie), że odpowiadający dwukrotnie sprawdził, czy ma rację, i nie po prostu przeredagował odpowiedzi, aby usunąć niepewność. Przypuszczam, że powinienem chcieć źródeł lub skrzypiec.
David Rivers

1
@AlexFord: Hej, stary. Dzięki za przeprosiny! Przepraszam, że nie było jasne, a mimo to zacząłem całe to nieporozumienie. Twój punkt jest ważny i zgadzam się z tobą. Chciałem się tylko upewnić, że nie jestem fałszywie przedstawiany, ale nie byłem jasny w moim własnym sformułowaniu. W każdym razie bez urazy i naprawdę szanuję, że mogłeś poznać mój punkt widzenia. Zdrowie, stary!
David Rivers,

5

Zawsze myślałem, że $wygląda jak „S” za obsługę.


to jest poprawna odpowiedź. To logiczne i proste. W rzeczywistości są to usługi, więc lepiej pamiętać, że $ „S” oznacza usługę. ładne proste wyjaśnienie.
Yonk

2
$ zakres to usługa?
deadend,

5

Znaki dolara ( $ ) uniemożliwiają również iterację (lub interpretację) elementów w niektórych dyrektywach. Na przykład właściwości zaczynające się od $ nie są używane z ng-repeatpowodu klauzuli if w pętli for :

if(collection.hasOwnProperty(key) && key.charAt(0) != '$')

Ktoś zgłosił problem dotyczący tego tematu na stronie Angulars na githubie


We shallowCopywłaściwościach metody zaczynających się od $$ są pomijane z powodu klauzuli if podczas iteracji właściwości :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {

2

@MarcoS podał link do https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope, który wyjaśnia różnicę między $ scope a scope. Uznałem to za przydatne, uzupełniając informacje w innych odpowiedziach.

W dyrektywie kątowej jest łącze i kontroler. Link jest standardową funkcją o ustalonym zestawie parametrów: zakres, element, obiekt atrybutów.

Argumenty kontrolera są zarządzane przez wtryskiwacz Angular i nie są zależne od kolejności. Wtryskiwacz ustala, które obiekty mają zostać przekazane, wyszukując parametry zaczynające się od $.

Autor https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope lepiej to wyjaśnia.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.