Улучшить эту документацию Просмотреть исходный код $rootScope.Scope
- тип в модуле ng
Корневой контекст может быть получен, используя ключ $rootScope из $injector. Дочерние контексты создаются с помощью метода $new(). (Большинство контекстов создаются автоматически при компиляции HTML-шаблона.)
Вот пример кода контекста, демонстрирующий, как взаимодействовать с контекстом.
<file src="./test/ng/rootScopeSpec.js" tag="docs1" />
Наследование
Контекст может наследоваться от родительского контекста, как показано в данном примере:
var parent = $rootScope;
var child = parent.$new();
parent.salutation = "Hello";
child.name = "World";
expect(child.salutation).toEqual('Hello');
child.salutation = "Welcome";
expect(child.salutation).toEqual('Welcome');
expect(parent.salutation).toEqual('Hello');
Использование
$rootScope.Scope([providers], [instanceCache]);
Аргументы
| Параметр | Тип | Подробности |
|---|---|---|
| providers (необязательно) | Object.<string, function()>= | Словарь фабрик сервисов, которые нужно предоставить для текущего контекста. По умолчанию |
| instanceCache (необязательно) | Object.<string, *>= | Предоставляет предопределённые сервисы, которые должны добавляться/перезаписывать сервисы, предоставляемые |
Возвращаемое значение
Object |
Созданный контекст. |
Методы
-
$new(isolate);
Создает новый дочерний scope.
Родительский scope будет передавать событие $digest(). Scope можно удалить из иерархии scope с помощью $destroy().
$destroy() необходимо вызывать для scope, когда требуется, чтобы scope и его дочерние scope были окончательно отделены от родительского и, следовательно, прекратили участие в обнаружении изменений модели и уведомлении слушателей путем вызова.
Параметры
Параметр Тип Подробности isolate booleanЕсли true, то scope не наследует прототипы от родительского scope. Scope изолирован, так как не может видеть свойства родительского scope. При создании виджетов это полезно для того, чтобы виджет случайно не считывал состояние родителя.
Возвращаемое значение
ObjectНовый созданный дочерний scope.
-
$watch(watchExpression, [listener], [objectEquality]);
Регистрирует
listenerобратный вызов, который выполняется всякий раз, когдаwatchExpressionизменяется.watchExpressionвызывается при каждом вызове $digest() и должен возвращать значение, которое будет отслеживаться. (Так как $digest() повторно выполняется, когда обнаруживает изменения,watchExpressionможет выполняться несколько раз за один $digest() и должен быть идемпотентным.)listenerвызывается только тогда, когда значение текущегоwatchExpressionи предыдущего вызоваwatchExpressionне равны (за исключением начального запуска, см. ниже). Неравенство определяется в соответствии с неравенством ссылок, строгим сравнением через!==оператор JavaScript, если толькоobjectEquality == true(см. следующий пункт)- Когда
objectEquality == true, неравенствоwatchExpressionопределяется в соответствии с функциейangular.equals. Для сохранения значения объекта для последующего сравнения используется функцияangular.copy. Это означает, что отслеживание сложных объектов будет иметь неблагоприятные последствия для памяти и производительности. - Отслеживание
listenerможет изменить модель, что может привести к запуску другихlistener. Это достигается путем повторного запуска наблюдателей до тех пор, пока не будут обнаружены изменения. Предел итераций повторного запуска составляет 10, чтобы предотвратить тупиковую ситуацию с бесконечным циклом.
Если вы хотите получать уведомления всякий раз, когда вызывается $digest, вы можете зарегистрировать
watchExpressionфункцию безlistener. (ПосколькуwatchExpressionможет выполняться несколько раз за цикл $digest, когда обнаружено изменение, будьте готовы к многократным вызовам вашего слушателя.)После регистрации наблюдателя в scope,
listenerфункция вызывается асинхронно (через $evalAsync) для инициализации наблюдателя. В редких случаях это нежелательно, потому что слушатель вызывается, когда результатwatchExpressionне изменился. Чтобы обнаружить эту ситуацию вlistenerфункции, вы можете сравнитьnewValиoldVal. Если эти два значения идентичны (===) слушатель был вызван из-за инициализации.В примере ниже показано использование функции в качестве вашего $watch слушателя
// 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 listener function var food; scope.foodCounter = 0; expect(scope.foodCounter).toEqual(0); scope.$watch( // This is the listener function function() { return food; }, // This is the change handler 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()stringОбратный вызов, вызываемый всякий раз, когда возвращаемое значение
watchExpressionизменяется.-
string: Оценивается как выражение -
function(newValue, oldValue, scope): вызывается с текущими и предыдущими значениями в качестве параметров.
objectEquality (необязательно)booleanСравнение для равенства объектов с помощью
angular.equalsвместо сравнения для равенства ссылок.Возвращаемое значение
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 также есть событие
$destroyjQuery, которое можно использовать для очистки привязок к 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]);
Выполняет выражение в текущей области видимости в более поздний момент времени.
$evalAsyncне гарантирует, когдаexpressionбудет выполнен, только то, что:- он будет выполнен после функции, которая запланировала вычисление (предпочтительно перед отрисовкой DOM).
- будет выполнен хотя бы один цикл $digest после выполнения
expression.
Любые исключения из выполнения выражения передаются в сервис $exceptionHandler.
Примечание: если эта функция вызывается вне цикла
$digest, будет запланирован новый цикл$digest. Однако рекомендуется всегда вызывать код, изменяющий модель, внутри вызова$apply. Это включает код, вычисляемый с помощью$evalAsync.Параметры
Параметр Тип Подробности expression (необязательно)stringfunction()Выражение Angular, которое необходимо выполнить.
-
string: выполняется по правилам, определённым в выражении. -
function(scope): выполняет функцию с текущим параметромscope.
-
$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.
Возвращаемое значение
*Результат вычисления выражения.
-
$on(name, listener);
Подписывается на события заданного типа. См. $emit для обсуждения жизненного цикла событий.
Формат функции-слушателя события:
function(event, args...). Объектevent, переданный в слушатель, имеет следующие атрибуты:-
targetScope-{Scope}: область видимости, на которой событие было$emit-о или$broadcast-о. -
currentScope-{Scope}: текущая область видимости, обрабатывающая событие. -
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 также существует событие jQuery
$destroy, которое можно использовать для очистки привязок DOM перед удалением элемента из DOM.Тип:
broadcastЦель:
уничтожаемая область видимости
Свойства
-
$id
Уникальный идентификатор области видимости (монотонно возрастающий), полезный для отладки.
-
$parent
Ссылка на родительскую область видимости.
-
$root
Ссылка на корневую область видимости.
© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.2.32/docs/api/ng/type/$rootScope.Scope