Улучшить эту документацию Просмотреть исходный код $rootScope.Scope
- тип в модуле ng
Корневой контекст может быть получен с использованием ключа $rootScope из $injector. Дочерние контексты создаются с использованием метода $new(). (Большинство контекстов создаются автоматически при компиляции HTML шаблона.) Подробнее о контекстах и примерах их использования см. в руководстве Scopes guide.
Наследование
Контекст может унаследовать от родительского контекста, как в этом примере:
var parent = $rootScope;
var child = parent.$new();
parent.salutation = "Hello";
expect(child.salutation).toEqual('Hello');
child.salutation = "Welcome";
expect(child.salutation).toEqual('Welcome');
expect(parent.salutation).toEqual('Hello');
При работе с Scope в тестах доступны дополнительные вспомогательные методы для экземпляров типа Scope. Дополнительные сведения см. в разделе ngMock Scope.
Использование
$rootScope.Scope([providers], [instanceCache]);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| providers (необязательно) | Object.<string, function()>= | Карта фабрик сервисов, которые необходимо предоставить для текущего контекста. По умолчанию |
| instanceCache (необязательно) | Object.<string, *>= | Предоставляет предварительно созданные сервисы, которые должны добавляться/переопределять сервисы, предоставляемые |
Возвращаемое значение
Object |
Созданный контекст. |
Методы
-
$new(isolate, parent);
Создаёт новый дочерний объект.
Родительский объект будет транслировать событие $digest(). Объект может быть удалён из иерархии объектов с помощью $destroy().
$destroy() необходимо вызвать для объекта, когда требуется, чтобы объект и его дочерние объекты были окончательно отделены от родительского и, таким образом, перестали участвовать в обнаружении изменений модели и уведомлении слушателей, вызвав.
Параметры
Параметр Тип Описание isolate booleanЕсли true, то объект не наследует прототипы от родительского объекта. Объект изолирован, так как не может видеть свойства родительского объекта. При создании виджетов это полезно, чтобы виджет случайно не считывал состояние родительского объекта.
parent (необязательно)ScopeОбъект
Scope, который будет родителем вновь созданного объекта. По умолчанию этоthisобъект, если не указано иначе. Это используется при создании переносимого объекта, чтобы правильно разместить его в иерархии объектов, сохраняя правильное прототипическое наследование.(по умолчанию: этот)
Возвращаемое значение
ObjectНовый созданный дочерний объект.
-
$watch(watchExpression, listener, [objectEquality]);
Регистрирует
listenerобратный вызов, который будет выполняться всякий раз, когдаwatchExpressionизменяется.watchExpressionвызывается при каждом вызове $digest() и должен возвращать значение, за которым будет следить. (watchExpressionне должен изменять своё значение при выполнении несколько раз с одним и тем же входом, потому что он может быть выполнен несколько раз $digest(). То есть,watchExpressionдолжен быть идемпотентным.listenerвызывается только тогда, когда значение от текущегоwatchExpressionи предыдущего вызоваwatchExpressionне равны (за исключением начального запуска, см. ниже). Неравенство определяется по ссылке, строгому сравнение через!==Javascript оператор, если не указаноobjectEquality == true(см. следующий пункт)- При
objectEquality == true, неравенствоwatchExpressionопределяется в соответствии с функциейangular.equals. Для сохранения значения объекта для последующего сравнения используется функцияangular.copy. Это означает, что отслеживание сложных объектов будет иметь неблагоприятные последствия для памяти и производительности. - Обработчик
listenerможет изменить модель, что может вызвать срабатывание другихlistener. Это достигается путём повторного запуска наблюдателей до тех пор, пока не будут обнаружены изменения. Предельное число повторов 10 для предотвращения бесконечного цикла.
Если вам нужно уведомляться всякий раз, когда вызывается $digest, можно зарегистрировать
watchExpressionфункцию безlistener. (Будьте готовы к многочисленным вызовам вашейwatchExpressionфункции, потому что она будет выполняться несколько раз в одном цикле $digest, если обнаружено изменение.)После регистрации наблюдателя в объекте,
listenerфункция вызывается асинхронно (через $evalAsync) для инициализации наблюдателя. В редких случаях это нежелательно, потому что слушатель вызывается, когда результатwatchExpressionне изменился. Чтобы определить эту ситуацию вlistenerфункции, сравнитеnewValиoldVal. Если эти два значения идентичны (===) то слушатель был вызван из-за инициализации.// let's assume that scope was dependency injected as the $rootScope var scope = $rootScope; scope.name = 'misko'; scope.counter = 0; expect(scope.counter).toEqual(0); scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; }); expect(scope.counter).toEqual(0); scope.$digest(); // the listener is always called during the first $digest loop after it was registered expect(scope.counter).toEqual(1); scope.$digest(); // but now it will not be called unless the value changes expect(scope.counter).toEqual(1); scope.name = 'adam'; scope.$digest(); expect(scope.counter).toEqual(2); // Using a function as a watchExpression var food; scope.foodCounter = 0; expect(scope.foodCounter).toEqual(0); scope.$watch( // This function returns the value being watched. It is called for each turn of the $digest loop function() { return food; }, // This is the change listener, called when the value returned from the above function changes function(newValue, oldValue) { if ( newValue !== oldValue ) { // Only increment the counter if the value changed scope.foodCounter = scope.foodCounter + 1; } } ); // No digest has been run so the counter will be zero expect(scope.foodCounter).toEqual(0); // Run the digest but since food has not changed count will still be zero scope.$digest(); expect(scope.foodCounter).toEqual(0); // Update food and run digest. Now the counter will increment food = 'cheeseburger'; scope.$digest(); expect(scope.foodCounter).toEqual(1);Параметры
Параметр Тип Описание watchExpression function()stringВыражение, которое вычисляется в каждом цикле $digest. Изменение возвращаемого значения вызывает вызов
listener.-
string: Вычисляется как выражение -
function(scope): вызывается с текущимscopeв качестве параметра.
listener function(newVal, oldVal, scope)Обратный вызов, вызываемый всякий раз, когда значение
watchExpressionизменяется.-
newValсодержит текущее значениеwatchExpression -
oldValсодержит предыдущее значениеwatchExpression -
scopeотносится к текущему объекту
objectEquality (необязательно)booleanСравнение на равенство объектов с использованием
angular.equalsвместо сравнения по ссылке.Возвращаемое значение
function()Возвращает функцию отмены регистрации для этого слушателя.
-
$watchGroup(watchExpressions, listener);
Вариант $watch(), где отслеживается массив
watchExpressions. Если изменяется любое выражение в коллекции, выполняетсяlistener.- Элементы массива
watchExpressionsотслеживаются с помощью стандартной операции $watch и проверяются при каждом вызове $digest() на предмет изменений. listenerвызывается всякий раз, когда изменяется любое выражение в массивеwatchExpressions.
Параметры
Параметр Тип Описание watchExpressions Array.<string|Function(scope)>Массив выражений, которые будут отслеживаться индивидуально с помощью $watch()
listener function(newValues, oldValues, scope)Обратный вызов, который вызывается всякий раз, когда изменяется возвращаемое значение любого выражения в
watchExpressions. МассивnewValuesсодержит текущие значенияwatchExpressions, а индексы совпадают с индексамиwatchExpression. МассивoldValuesсодержит предыдущие значенияwatchExpressions, а индексы совпадают с индексамиwatchExpression.scopeотносится к текущему объекту.Возвращаемое значение
function()Возвращает функцию отмены регистрации для всех слушателей.
- Элементы массива
-
$watchCollection(obj, listener);
Поверхностно следит за свойствами объекта и срабатывает всякий раз, когда изменяется любое из свойств (для массивов это подразумевает отслеживание элементов массива; для карт объектов — отслеживание свойств). Если обнаружено изменение, вызывается
listenerобратный вызов.- Коллекция
objнаблюдается с помощью стандартной операции $watch и проверяется при каждом вызове $digest() на предмет добавления, удаления или перемещения элементов. listenerвызывается всякий раз, когда что-либо вobjизменяется. Примеры включают добавление, удаление и перемещение элементов, принадлежащих объекту или массиву.
$scope.names = ['igor', 'matias', 'misko', 'james']; $scope.dataCount = 4; $scope.$watchCollection('names', function(newNames, oldNames) { $scope.dataCount = newNames.length; }); expect($scope.dataCount).toEqual(4); $scope.$digest(); //still at 4 ... no changes expect($scope.dataCount).toEqual(4); $scope.names.pop(); $scope.$digest(); //now there's been a change expect($scope.dataCount).toEqual(3);Параметры
Параметр Тип Описание obj stringfunction(scope)Вычисляется как выражение. Значение выражения должно вычисляться в объект или массив, который наблюдается в каждом цикле $digest. Любое поверхностное изменение в коллекции вызовет вызов
listener.listener function(newCollection, oldCollection, scope)функция обратного вызова, вызываемая при обнаружении изменения.
- Объект
newCollection— это новые изменённые данные, полученные из выраженияobj - Объект
oldCollection— это копия предыдущих данных коллекции. По соображениям производительности значениеoldCollectionвычисляется только в том случае, если функцияlistenerобъявляет два или более аргумента. - Аргумент
scopeотносится к текущему объекту.
Возвращаемое значение
function()Возвращает функцию отмены регистрации для этого слушателя. При выполнении функции отмены регистрации внутренняя операция наблюдения завершается.
- Коллекция
-
$digest();
Обрабатывает всех наблюдателей текущего объекта и его дочерних объектов. Поскольку слушатель наблюдателя может изменить модель,
$digest()продолжает вызывать наблюдателей, пока не прекратятся срабатывания слушателей. Это означает, что может возникнуть бесконечный цикл. Эта функция выбросит'Maximum iteration limit exceeded.'если число итераций превысит 10.Обычно вы не вызываете
$digest()напрямую в контроллерах или в директивах. Вместо этого вы должны вызвать $apply() (обычно изнутри директивы), которая принудительно вызовет$digest().Если вы хотите получать уведомления всякий раз, когда вызывается
$digest(), вы можете зарегистрироватьwatchExpressionфункцию с помощью $watch() безlistener.В тестах юнит-тестирования вам, возможно, потребуется вызвать
$digest()для имитации жизненного цикла объекта.var scope = ...; scope.name = 'misko'; scope.counter = 0; expect(scope.counter).toEqual(0); scope.$watch('name', function(newValue, oldValue) { scope.counter = scope.counter + 1; }); expect(scope.counter).toEqual(0); scope.$digest(); // the listener is always called during the first $digest loop after it was registered expect(scope.counter).toEqual(1); scope.$digest(); // but now it will not be called unless the value changes expect(scope.counter).toEqual(1); scope.name = 'adam'; scope.$digest(); expect(scope.counter).toEqual(2);
-
$destroy();
Удаляет текущий контекст (и все его дочерние контексты) из родительского контекста. Удаление подразумевает, что вызовы $digest() больше не будут распространяться на текущий контекст и его дочерние контексты. Удаление также подразумевает, что текущий контекст может быть удалён сборщиком мусора.
$destroy()обычно используется директивами, такими как ngRepeat, для управления разворачиванием цикла.Непосредственно перед уничтожением контекста на этом контексте транслируется событие
$destroy. Код приложения может зарегистрировать обработчик события$destroy, который предоставит ему возможность выполнить необходимую очистку.Обратите внимание, что в AngularJS также есть событие jQuery
$destroy, которое можно использовать для очистки привязок к DOM перед удалением элемента из DOM. -
$eval([expression], [locals]);
Выполняет
expressionв текущем контексте и возвращает результат. Любые исключения в выражении передаются вверх (необработанные). Это полезно при оценке выражений Angular.var scope = ng.$rootScope.Scope(); scope.a = 1; scope.b = 2; expect(scope.$eval('a+b')).toEqual(3); expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);Параметры
Параметр Тип Подробности expression (необязательно)stringfunction()Выражение Angular, которое должно быть выполнено.
-
string: выполнить по правилам, определённым в выражении. -
function(scope): выполнить функцию с текущим параметромscope.
locals (необязательно)objectОбъект локальных переменных, полезный для переопределения значений в контексте.
Возвращает
*Результат оценки выражения.
-
-
$evalAsync([expression], [locals]);
Выполняет выражение в текущем контексте в более поздний момент времени.
$evalAsyncне гарантирует, когдаexpressionбудет выполнено, только то, что:- он будет выполняться после функции, которая запланировала оценку (предпочтительно перед отрисовкой DOM).
- будет выполнена как минимум одна $цикл обработки после
expressionвыполнения.
Любые исключения из выполнения выражения передаются сервису $exceptionHandler.
Примечание: если эта функция вызывается вне цикла
$digest, будет запланирован новый цикл$digest. Однако рекомендуется всегда вызывать код, изменяющий модель, внутри вызова$apply. Это включает код, оцененный с помощью$evalAsync.Параметры
Параметр Тип Подробности expression (необязательно)stringfunction()Выражение Angular, которое должно быть выполнено.
-
string: выполнить по правилам, определённым в выражении. -
function(scope): выполнить функцию с текущим параметромscope.
locals (необязательно)objectОбъект локальных переменных, полезный для переопределения значений в контексте.
-
$apply([exp]);
$apply()используется для выполнения выражения Angular извне фреймворка Angular. (Например, из событий DOM браузера, setTimeout, XHR или сторонних библиотек). Поскольку мы вызываем фреймворк Angular, нам необходимо выполнить правильный жизненный цикл контекста обработки исключений, выполнения наблюдений.Жизненный цикл
Псевдокод $apply()
function $apply(expr) { try { return $eval(expr); } catch (e) { $exceptionHandler(e); } finally { $root.$digest(); } }Метод
$apply()контекста проходит следующие этапы:- Выражение выражение выполняется с помощью метода $eval().
- Любые исключения из выполнения выражения передаются сервису $exceptionHandler.
- Прослушиватели наблюдения срабатывают сразу после выполнения выражения с использованием метода $digest().
Параметры
Параметр Тип Подробности exp (необязательно)stringfunction()Выражение Angular, которое должно быть выполнено.
-
string: выполнить по правилам, определённым в выражении. -
function(scope): выполнить функцию с текущим параметромscope.
Возвращает
*Результат оценки выражения.
-
$applyAsync([exp]);
Планирует вызов $apply в более позднее время. Фактическое время разницы варьируется в разных браузерах, но обычно составляет около ~10 миллисекунд.
Это можно использовать для очереди нескольких выражений, которые нужно оценить в одном цикле обработки.
Параметры
Параметр Тип Подробности exp (необязательно)stringfunction()Выражение Angular, которое должно быть выполнено.
-
string: выполнить по правилам, определённым в выражении. -
function(scope): выполнить функцию с текущим параметромscope.
-
-
$on(name, listener);
Прослушивает события заданного типа. См. $emit для обсуждения жизненного цикла события.
Формат функции обработчика событий:
function(event, args...). Объектeventпередаваемый обработчику, имеет следующие атрибуты:-
targetScope-{Scope}: контекст, на котором событие было$emit- или$broadcast-то. -
currentScope-{Scope}: контекст, который в данный момент обрабатывает событие. После того, как событие распространяется по иерархии контекстов, это свойство устанавливается в null. -
name-{string}: имя события. -
stopPropagation-{function=}: вызовstopPropagationфункции отменяет дальнейшее распространение события (доступно только для событий, которые были$emit-то). -
preventDefault-{function}: вызовpreventDefaultустанавливает флагdefaultPreventedв true. -
defaultPrevented-{boolean}: true, еслиpreventDefaultбыл вызван.
Параметры
Параметр Тип Подробности name stringИмя события, на котором нужно прослушивать.
listener function(event, ...args)Функция для вызова, когда событие испускается.
Возвращает
function()Возвращает функцию отмены регистрации этого обработчика.
-
-
$emit(name, args);
Отправляет событие
nameвверх по иерархии контекста, уведомляя зарегистрированных$rootScope.Scopeслушателей.Жизненный цикл события начинается в контексте, на котором был вызван
$emit. Все слушатели, прослушивающие событиеnameв этом контексте, получают уведомление. После этого событие перемещается вверх к корневому контексту и вызывает всех зарегистрированных слушателей по пути. Событие перестанет распространяться, если один из слушателей его отменит.Любое исключение, испущенное слушателями, будет передано сервису $exceptionHandler.
Параметры
Параметр Тип Подробности name stringИмя события для отправки.
args *Необязательные один или более аргументов, которые будут переданы слушателям события.
Возвращает
ObjectОбъект события (см.
$rootScope.Scope). -
$broadcast(name, args);
Отправляет событие
nameвниз по всем дочерним контекстам (и их дочерним контекстам), уведомляя зарегистрированных$rootScope.Scopeслушателей.Жизненный цикл события начинается в контексте, на котором был вызван
$broadcast. Все слушатели, прослушивающие событиеnameв этом контексте, получают уведомление. После этого событие распространяется к всем прямым и косвенным контекстам текущего контекста и вызывает всех зарегистрированных слушателей по пути. Событие не может быть отменено.Любое исключение, испущенное слушателями, будет передано сервису $exceptionHandler.
Параметры
Параметр Тип Подробности name stringИмя события для отправки.
args *Необязательные один или более аргументов, которые будут переданы слушателям события.
Возвращает
ObjectОбъект события, см.
$rootScope.Scope
События
-
$destroy
Транслируется, когда область видимости и её дочерние элементы уничтожаются.
Обратите внимание, что в AngularJS также есть событие
$destroyjQuery, которое можно использовать для очистки связей с DOM перед удалением элемента из DOM.Тип:
broadcastЦелевой объект:
уничтожаемая область видимости
Свойства
-
$id
Уникальный идентификатор области видимости (монотонно возрастающий), полезный для отладки.
-
$parent
Ссылка на родительскую область видимости.
-
$root
Ссылка на корневую область видимости.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.4.14/docs/api/ng/type/$rootScope.Scope