Spec-Zone.ru › Angular.js 1.5

Улучшить эту документацию Просмотреть исходный код $rootScope.Scope

  1. тип в модуле ng

Корневой контекст может быть получен с использованием ключа $rootScope из $injector. Дочерние контексты создаются с использованием метода $new(). (Большинство контекстов создаются автоматически при выполнении скомпилированной HTML-шаблона.) См. также руководство по контекстам для углубленного введения и примеров использования.

Наследование

Контекст может наследовать от родительского контекста, как в этом примере:

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()>=

Карта фабрик сервисов, которые необходимо предоставить для текущего контекста. По умолчанию ng.

instanceCache
(необязательно)
Object.<string, *>=

Предоставляет предварительно созданные сервисы, которые должны добавлять/перезаписывать сервисы, предоставленные providers. Это удобно при тестировании и необходимости переопределения стандартного сервиса.

Возвращаемое значение

Object

Созданный контекст.

Методы

  • $new(isolate, parent);

    Создаёт новый дочерний объект.

    Родительский объект будет распространять событие $digest(). Объект можно удалить из иерархии объектов, используя $destroy().

    $destroy() необходимо вызывать на объекте, когда требуется, чтобы объект и его дочерние объекты были постоянно отсоединены от родительского и, таким образом, прекратили участие в обнаружении изменений модели и уведомлении слушателей, вызывая его.

    Параметры

    Параметр Тип Подробности
    isolate boolean

    Если true, то объект не наследует прототип от родительского объекта. Объект изолирован, поскольку он не может видеть свойства родительского объекта. При создании виджетов полезно, чтобы виджет не читал случайно состояние родителя.

    parent
    (необязательно)
    Scope

    Объект Scope, который будет $parent вновь созданного объекта. По умолчанию 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 вместо сравнения на равенство ссылок.

    (по умолчанию: false)

    Возвращаемое значение

    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 в текущей области видимости и возвращает результат. Любые исключения в выражении передаются дальше (не перехватываются). Это полезно при оценке угловых выражений.

    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()

    Угловое выражение для выполнения.

    • string: выполняется по правилам, определенным в выражении.
    • function(scope): выполняет функцию с текущим параметром scope.
    locals
    (необязательно)
    object

    Объект локальных переменных, полезный для переопределения значений в области видимости.

    Возвращаемое значение

    *

    Результат вычисления выражения.

  • $evalAsync([expression], [locals]);

    Выполняет выражение в текущей области видимости в более поздний момент времени.

    $evalAsync не гарантирует, когда expression будет выполнено, только то, что:

    • он будет выполнен после функции, которая запланировала оценку (предпочтительно перед рендерингом DOM).
    • после выполнения expression будет выполнено по крайней мере один цикл $digest.

    Любые исключения от выполнения выражения передаются в сервис $exceptionHandler.

    Примечание: если эта функция вызывается вне цикла $digest, будет запланирован новый цикл $digest. Однако рекомендуется всегда вызывать код, изменяющий модель, внутри вызова $apply. Это включает код, оцениваемый с помощью $evalAsync.

    Параметры

    Параметр Тип Описание
    expression
    (необязательно)
    stringfunction()

    Угловое выражение для выполнения.

    • string: выполняется по правилам, определенным в выражении.
    • function(scope): выполняет функцию с текущим параметром scope.
    locals
    (необязательно)
    object

    Объект локальных переменных, полезный для переопределения значений в области видимости.

  • $apply([exp]);

    $apply() используется для выполнения выражения в Angular извне фреймворка Angular (например, из событий DOM браузера, setTimeout, XHR или сторонних библиотек). Поскольку мы вызываем фреймворк Angular, нам необходимо выполнить правильный жизненный цикл области видимости, включая обработку исключений $exceptionHandler, выполнение отслеживаний watches.

    Жизненный цикл

    Псевдокод $apply()

    function $apply(expr) {
      try {
        return $eval(expr);
      } catch (e) {
        $exceptionHandler(e);
      } finally {
        $root.$digest();
      }
    }
    

    Метод $apply() области видимости проходит следующие стадии:

    1. Выражение expression выполняется с помощью метода $eval().
    2. Любые исключения при выполнении выражения передаются в сервис $exceptionHandler.
    3. Слушатели watch вызываются сразу после выполнения выражения с помощью метода $digest().

    Параметры

    Параметр Тип Описание
    exp
    (необязательно)
    stringfunction()

    Угловое выражение для выполнения.

    • string: выполняется по правилам, определенным в выражении.
    • function(scope): выполняет функцию с текущим параметром scope.

    Возвращаемое значение

    *

    Результат вычисления выражения.

  • $applyAsync([exp]);

    Планирует выполнение $apply в более позднее время. Время разницы изменяется в разных браузерах, но обычно составляет около ~10 миллисекунд.

    Это можно использовать для очереди нескольких выражений, которые должны быть оценены в одном digest.

    Параметры

    Параметр Тип Описание
    exp
    (необязательно)
    stringfunction()

    Угловое выражение для выполнения.

    • 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. Все слушатели listeners, слушающие событие name в этой области видимости, уведомляются. После этого событие перемещается вверх к корневой области видимости и вызывает всех зарегистрированных слушателей по пути. Событие прекратит распространение, если один из слушателей его отменит.

    Любое исключение, выданное слушателями, будет передано в сервис $exceptionHandler.

    Параметры

    Параметр Тип Описание
    name string

    Имя события, которое нужно отправить.

    args *

    Необязательные один или несколько аргументов, которые будут переданы слушателям событий.

    Возвращаемое значение

    Object

    Объект события (см. $rootScope.Scope).

  • $broadcast(name, args);

    Отправляет событие name вниз к всем дочерним областям видимости (и их дочерним элементам), уведомляя зарегистрированных слушателей $rootScope.Scope.

    Жизненный цикл события начинается в области видимости, в которой был вызван $broadcast. Все слушатели listeners, слушающие событие name в этой области видимости, уведомляются. После этого событие распространяется во все прямые и косвенные области видимости текущей области видимости и вызывает всех зарегистрированных слушателей по пути. Событие не может быть отменено.

    Любое исключение, выданное слушателями, будет передано в сервис $exceptionHandler.

    Параметры

    Параметр Тип Описание
    name string

    Имя события для передачи.

    args *

    Необязательные один или несколько аргументов, которые будут переданы слушателям событий.

    Возвращаемое значение

    Object

    Объект события, см. $rootScope.Scope.

События

  • $destroy

    Транслируется, когда область видимости и её дочерние элементы уничтожаются.

    Обратите внимание, что в AngularJS также существует событие jQuery $destroy, которое можно использовать для очистки привязок к DOM перед удалением элемента из DOM.

    Тип:

    вещательное

    Целевой объект:

    уничтожаемая область видимости

Свойства

  • $id

    Уникальный идентификатор области видимости (монотонно возрастающий), полезный для отладки.

  • $parent

    Ссылка на родительскую область видимости.

  • $root

    Ссылка на корневую область видимости.

© 2010–2017 Google, Inc.
Licensed under the Creative Commons Attribution License 4.0.
https://code.angularjs.org/1.5.11/docs/api/ng/type/$rootScope.Scope

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API