AngularJS и его использование долларовых переменных

128

Кто-нибудь знает, является ли причина использования долларовых методов и переменных в angularJS в том, чтобы инструктировать angularJS избегать проверки этих значений, когда происходит переваривание? Итак, если встречается angular $scope.$valueи $scope.value, тогда он будет избегать проверки первого, поскольку он имеет префикс символа доллара в имени переменной?

Мацко
источник
См. Также это сообщение в блоге о разнице между «$ scope» и «scope» в angularjs ...
MarcoS
19
Angular, вероятно, пытается забрать $ у jQuery.
daniel1426
Эта ссылка перенаправляет на страницу, которая мало что объясняет о $ scope.
Пол Браннан,
5
Документы для директивы - у контроллера есть $scope, а у директивы есть scope. WTF?
LeeGee

Ответы:

87

Angular несколько раз игнорирует переменные с префиксом доллара:

  1. В комментарии Шумли ниже, где фильтры json их не выводят
  2. При использовании {{ }}директивы angular не будет отображать вложенные $ переменные. Например, здесь отображается только visibleсвойство.

    <div ng-init="n = { visible: 'foo', $ignore: 'bar' };">{{ n }}</div>
  3. Кроме того, при добавлении явного наблюдателя к объекту области изменения свойств со знаком доллара в начале этого объекта не будут запускать наблюдателя. Смотрите эту обновленную скрипку .

  4. angular.equals() игнорирует ключи с префиксом$ .

Рой Трулав
источник
Да, похоже, ты прав. Даже с событиями щелчка и т. Д. Он все равно меняется. Спасибо.
matsko
7
Некоторые части Angular игнорируют свойства с префиксом, например, фильтр «json» не выводит переменную, начинающуюся с «$».
Schmuli
116

Это просто соглашение об именах из приведенного ниже фрагмента http://docs.angularjs.org/tutorial/step_05

Соглашение об именовании префиксов '$'
Вы можете создавать свои собственные сервисы, и фактически мы сделаем именно это на шаге 11. В качестве соглашения об именовании встроенные сервисы angular, методы Scope и несколько других API-интерфейсов angular имеют префикс '$'. перед именем. Не используйте префикс '$' при именовании своих услуг и моделей, чтобы избежать возможных конфликтов имен.

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

Пространство имен Angular
Чтобы предотвратить случайное столкновение имен, Angular добавляет префиксы к именам объектов, которые потенциально могут столкнуться с $. Пожалуйста, не используйте префикс $ в своем коде, так как он может случайно столкнуться с кодом Angular.

Venkat
источник
2
Почему директива doc [1] находится $scopeв контроллере, а scopeв директиве? --- [1] docs.angularjs.org/guide/directive
LeeGee, 09
2
@LeeGee Это просто соглашение. stackoverflow.com/a/19289054/114558
rinogo 03 авг.16,
30

$Префикс обозначает переменную, параметр, свойство или метод , который принадлежит к ядру угловой.

Свойства объектов, которые происходят внутри платформы, но фактически не являются частью API, могут начинаться с $- или даже $$- для обозначения частного метода или свойства. Таким же образом _префикс часто используется в других библиотеках.

Это не влияет на способ интерпретации кода средой выполнения, хотя сам фреймворк может придавать ему особое значение. По сути, это соглашение об именах, которое гласит: «Не стоит связываться с этим».

Dalgard
источник
Я думаю, вы неправильно поняли. Среда выполнения не заботится о том, какие переменные названы. Вы могли бы назвать это $$__$_$- это просто идентификатор, не имеющий особого значения для интерпретатора.
dalgard
Я добавил несколько слов, чтобы подчеркнуть различие между средой выполнения и фреймворком; будьте так любезны изменить свой голос.
dalgard
7

Не совсем уверен, но я считаю, что внутреннее устройство AngularJS полагается на управление этими переменными с префиксом $ во время дайджеста. Проверка этих переменных будет означать, что дайджест никогда не стабилизируется, поскольку они могут постоянно меняться в течение каждого цикла дайджеста.

Но не цитируйте меня по этому поводу. :)

btford
источник
10
Проголосовали против из-за: "Не цитируйте меня". Извините, но ответ, допускающий неопределенность, не очень полезен :(
Дэвид Риверс
2
Голос против преобразуется в голос вверх. Если вы правы, это полезный ответ!
Дэвид Риверс
2
@DavidRivers, если изначально ответ был неуверенным, его изменение не сделает его более полезным. Фактически, ответ может быть неверным, и отсутствие колебаний подтвердит потенциальную ошибочность . Вместо этого, чтобы этот ответ считался полезным, он должен быть подкреплен некоторыми доказательствами со ссылкой на надежные источники или предоставлением скрипки для воспроизведения выраженных пунктов.
Ивайло Славов
1
@IvayloSlavov: Абсолютно согласен с вами. Я предположил (возможно, ошибочно), что ответчик дважды проверил свою правоту, а не просто переформулировал ответ, чтобы устранить неопределенность. Полагаю, мне следовало хотеть исходники или скрипки.
Дэвид Риверс
1
@AlexFord: Привет, чувак. Спасибо за извинения! Мне жаль, что я не понял, и все равно начал все это недопонимание. Ваша точка зрения действительна, и я согласен с вами. Я просто хотел убедиться, что меня не исказили, но я не совсем понял свою формулировку. В любом случае, никаких обид, и я очень уважаю, что вы смогли понять мою точку зрения. Ура, мужик!
Дэвид Риверс
5

Я всегда считал, что $выглядит как «S» за обслуживание.

Марк М.
источник
это правильный ответ. Все логично и просто. На самом деле это службы, поэтому лучше помнить, что $ S предназначена для обслуживания. красивое простое объяснение.
Йонк
2
$ scope - это услуга?
deadend
5

Знак доллара ( $ ) также предотвращает повторение (или интерпретацию) элементов в определенных директивах. Так, например, свойства, начинающиеся с $ , не используются ng-repeatиз-за предложения if в цикле for :

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

Кто-то поднял вопрос по теме здесь, на странице angulars github


В shallowCopyсвойствах метода , начинающихся с $$ , пропускаются из-за предложения if при повторении свойств :

if (!(key.charAt(0) === '$' && key.charAt(1) === '$')) {
Уилт
источник
1

@MarcoS предоставил ссылку на https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope которая объясняет разницу между $ scope и scope. Я нашел это полезным, добавив к информации в других ответах.

В директиве angular есть ссылка и контроллер. Ссылка представляет собой стандартную функцию с фиксированным набором параметров: область действия, элемент, объект атрибутов.

Аргументы контроллера управляются инжектором Angular и не зависят от порядка. Инжектор решает, какие объекты передать, ища параметры, начинающиеся с $.

Автор https://thinkster.io/a-better-way-to-learn-angularjs/scope-vs-scope лучше объясняет это.

Bryan
источник
-1

Огромная разница не в переменных, а в параметрах, которые получает контроллер. Параметр области полностью отличается от параметра $ scope.

Для получения дополнительной информации ознакомьтесь с этим полезным сообщением: http://www.thinkster.io/angularjs/aw9kWmdnik/angularjs-scope-vs-scope

mrodrigues
источник