Що таке $scope в AngularJS? Підручник з прикладом

⚡ Розумний підсумок

$Scope в AngularJS – це вбудований об'єкт, який прив'язує контролер до його представлення. На цій сторінці пояснюється створення області видимості, функції поведінки, ієрархія батьківських та дочірніх об'єктів, відмінність від $rootScope та те, як digest циклічно оновлює прив'язки.

  • 🔗 Зв'язуюча роль: $scope переносить змінні-члени з контролера у представлення, тому шаблони відображають дані, не торкаючись безпосередньо DOM.
  • Функції поведінки: Приєднуйте функції до $scope, коли представленню потрібно реагувати на кліки, зміни вводу або інші події користувача.
  • ???? Ієрархія областей застосування: Такі директиви, як ng-controller та ng-repeat, створюють дочірні області видимості, що відображають дерево DOM застосунку.
  • 🌍 Охоплення $rootScope: Для кожної програми існує один об'єкт $rootScope, який поводиться як глобальний об'єкт, який може читати кожна дочірня область видимості.
  • 🔍 Цикл перетравлення: $watch реєструє слухачі, $apply вводить контекст виконання AngularJS, а $digest порівнює значення, доки модель не стабілізується.
  • ???? Звичка до виконання: Зберігайте простими вирази спостереження, уникайте доступу до DOM всередині них та викликайте $destroy для областей видимості, які більше не потрібні.

Що таке $Scope в AngularJS

Що таке $scope в AngularJS?

$scope в AngularJS це вбудований об’єкт, який в основному пов’язує «контролер» і «перегляд». Можна визначити змінні-члени в області видимості в контролері, до яких потім може бути доступний перегляд.

Кожен контролер у AngularJS додаток отримує власний екземпляр $scope через впровадження залежностей. Все, що ви прикріплюєте до цього об'єкта, стає видимим для шаблону, яким керує контролер, тому $scope поводиться як спільна модель даних, що знаходиться між вашим JavaЛогіка скрипта та ваша HTML-розмітка.

Розглянемо приклад нижче:

$scope в AngularJS

angular.module('app',[]).controller('HelloWorldCtrl',
	function($scope)
	{
		$scope.message = "Hello World"
	});

Code Пояснення:

  1. Назва модуля — «додаток»
  2. Назва контролера — «HelloWorldCtrl»
  3. Об’єкт області – це основний об’єкт, який використовується для передачі інформації від контролера до представлення.
  4. Змінну члена додано до об’єкта області

⚠️ Попередження про синтаксис: Команда .controller() Метод приймає два аргументи: назву контролера та функцію factory, тому між ними потрібна кома. 'HelloWorldCtrl' та function($scope)Якщо пропустити кому, це призведе до Uncaught SyntaxError ще до появи AngularJS з бутстрепами.

Один контролер та одне представлення – це лише половина успіху. Реальні програми вкладають контролери, повторюють списки та повторно використовують віджети, що означає, що одночасно існує кілька областей видимості.

Як працюють ієрархія областей видимості та спадкування в AngularJS

Кожен AngularJS-застосунок має рівно одну кореневу область видимості та може мати будь-яку кількість дочірніх областей видимості. Директиви створюють ці дочірні області видимості та приєднують їх до елемента DOM, який вони декорують, таким чином дерево областей видимості відображає структуру відображеної сторінки.

Коли AngularJS обчислює вираз, такий як {{siteName}}, він спочатку шукає цю властивість в області видимості, приєднаній до елемента. Якщо властивість відсутня, пошук переходить до батьківської області видимості та продовжує підніматися, доки не досягне кореневої області видимості. JavaРозробникам скриптів відома така поведінка як прототипальне успадкування, і дочірні області видимості успадковуються від батьків саме таким чином.

У наведеному нижче прикладі один контролер вкладено в інший, щоб ви могли спостерігати за процесом успадкування.

<div ng-app="scopeDemo">
    <div ng-controller="ParentCtrl">
        Parent scope value: {{siteName}}
        <div ng-controller="ChildCtrl">
            Child reads parent value: {{siteName}}
            Child own value: {{lesson}}
        </div>
    </div>
</div>

<script type="text/javascript">
    var app = angular.module("scopeDemo", []);

    app.controller("ParentCtrl", function($scope) {
        $scope.siteName = "Guru99";
    });

    app.controller("ChildCtrl", function($scope) {
        $scope.lesson = "AngularJS Scope";
    });
</script>

Code Пояснення:

  1. ParentCtrl визначає siteName у власній сфері.
  2. ChildCtrl ніколи не визначає siteName, проте внутрішній div все одно друкується Guru99 тому що пошук переходить до батьківської області видимості.
  3. lesson знаходиться лише в дочірній області видимості, тому батьківський div не може його прочитати.

Які директиви створюють нову область застосування?

  • ng-контролер: створює дочірню область видимості для елемента, на якому вона розміщена.
  • ng-повтор: створює одну дочірню область видимості на ітерацію, тому кожен рядок може містити різні значення для одного й того ж виразу.
  • Спеціальні директиви: може запитувати дочірню область видимості або ізолювати область, яка навмисно не успадковує від свого батьківського об'єкта.
  • Директиви компонентів: будь-що зареєстроване в .component() помічник завжди отримує ізолятну область видимості.

Оскільки дочірні області видимості читаються знизу вгору, розробники часто задаються питанням, де знаходиться вершина цього ланцюжка. Цей об'єкт верхнього рівня називається $rootScope.

$scope проти $rootScope: у чому різниця?

AngularJS $rootScope — це область видимості для всієї програми. Програма може мати лише одну змінну $rootScope, і вона використовується як глобальна змінна. Кожна змінна $scope є дочірньою областю видимості, а $rootScope — батьківською на вершині дерева. У таблиці нижче порівнюються два об'єкти.

Аспект $scope $rootScope
Кількість екземплярів на додаток Багато, по одному на контролер або директиву, що створює область видимості Рівно один
Створений Такі директиви, як ng-controller і ng-repeat Інжектор під час початкового завантаження програми
Видимість Його власний елемент та всі нащадки Кожна область застосування в додатку
Типове використання Дані та поведінка для одного представлення або одного рядка списку Значення для всієї програми, такі як користувач, що зареєстрований у системі
Основний ризик Значення стають недосяжними поза межами гілки Колізії імен та приховане зв'язування, як-от глобальні змінні

Використовуйте $rootScope економно. Все, що розміщено там, зберігається для всієї програми та читається будь-де, тому спільний сервіс зазвичай є безпечнішим місцем для глобального стану. Офіційний Посилання на $rootScope містить повний список API.

Знання того, де зберігаються дані, – це одна половина роботи. Інша половина – навчити розробника реагувати на дії користувача.

Налаштування або додавання поведінки в AngularJS

Щоб реагувати на події або виконувати певні обчислення/обробку в представленні, ми повинні забезпечити поведінку для області.

Поведінки додаються до об’єктів області, щоб реагувати на певні події, які можуть бути викликані View. Як тільки поведінка визначена в контролері, до неї можна отримати доступ за допомогою представлення.

Давайте розглянемо приклад того, як ми можемо цього досягти.

Налаштування або додавання поведінки

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta chrset="UTF 8">
    <title>Guru99</title>     
</head>  
<body ng-app="DemoApp">
<h1> Guru99 Global Event</h1>
<script src="https://code.angularjs.org/1.6.9/angular.js"></script>
<div ng-controller="DemoController">
	{{fullName("Guru","99")}}
</div>
<script type="text/javascript">  
	var app = angular.module("DemoApp", []);
	app.controller("DemoController", function($scope) {
    
    $scope.fullName=function(firstName,lastname){
		return firstName + lastname;
		}
	} );
</script> 

</body>  
</html>

Code Пояснення:

  1. Ми створюємо поведінку під назвою «fullName». Ця поведінка є функцією, яка приймає 2 параметри (ім’я, прізвище).
  2. Потім поведінка повертає конкатенацію цих 2 параметрів.
  3. У представленні ми викликаємо поведінку та передаємо 2 значення «Guru«» та «99», які передаються як параметри поведінки.

Якщо команда виконана успішно, під час запуску коду в браузері буде показано наступний результат.

вихід:

Налаштування або додавання поведінки

У браузері ви побачите об'єднання обох значень Guru & 99, які були передані поведінці в контролер.

Прив'язки, подібні до наведеної вище, оновлюються самостійно, і механізм, який це забезпечує, варто зрозуміти, перш ніж програма стане великою.

Чому важливі спостерігачі за обсягом даних та цикл дайджесту

AngularJS підтримує відповідність представлення області видимості (view) до області видимості (scope) за допомогою перевірки "брудних" елементів, а не за допомогою подій зміни (change). Цей процес керується трьома API області видимості:

  • $watch: реєструє слухач для виразу. Інтерполяції, такі як {{fullName}} зареєструвати спостерігачів для вас під час зв'язування шаблонів.
  • $застосувати: входить у контекст виконання AngularJS, оцінює ваш код, а потім запускає дайджест. Він потрібен лише всередині зворотних викликів користувацьких подій або зворотних викликів сторонніх бібліотек, оскільки вбудовані директиви вже викликають його.
  • $дайджест: переглядає кожен спостерігач на $rootScope та його дочірніх об'єктах, порівнюючи поточне значення з попереднім, і повторює це, доки модель не перестане змінюватися.

Оскільки дайджест може виконуватися кілька разів, вирази спостереження повинні залишатися економними. Уникайте доступу до DOM всередині них, оскільки читання DOM відбувається на кілька порядків повільніше, ніж читання JavaВластивість скрипта.

Глибина спостереження також впливає на вартість. Спостереження за посиланням є найшвидшим і помічає лише тоді, коли замінюється все значення. $watchCollection помічає додавання, видалення або зміну порядку елементів всередині масиву чи об'єкта. Спостереження за значенням обходить вкладену структуру на кожному дайджесті та є найдорожчим варіантом, тому використовуйте його в останню чергу.

Поширені запитання

Ізолятна область видимості не успадковується прототипно від батьківського об'єкта. Директиви компонента, побудовані за допомогою допоміжної функції .component(), завжди отримують таку область видимості, що робить віджети, що повторно використовуються, незалежними від навколишнього контролера та блокує випадкове зчитування батьківських властивостей.

$emit надсилає подію області видимості вгору через батьківські області видимості до $rootScope, тоді як $broadcast надсилає її вниз до кожної дочірньої області видимості. Обидва отримуються з $on. Використовуйте $broadcast економно, оскільки він відвідує кожну дочірню область видимості.

Викличте scope.$destroy(), коли дочірня область видимості більше не потрібна. Це зупиняє поширення дайджесту в область видимості та дозволяє збирачу сміття повернути свої моделі. Також скасуйте реєстрацію ручних спостерігачів, викликавши функцію, яку повертає $watch.

Такі помічники, як Копілот GitHub швидко створюють шаблонний опис області застосування, але все одно видають помилки, такі як пропущена кома в реєстрації контролера. Перевіряйте кожен згенерований фрагмент з офіційним Документація щодо області видимості AngularJS.

Помічники ШІ відображають властивості $scope на поля класу компонента та переписують логіку $watch як сигнали або потоки RxJS. Поєднуйте їх з офіційними Angular документацію та запускати модульні тести, оскільки згенеровані перетворення часто не враховують успадковані пошуки області видимості.

Підсумуйте цей пост за допомогою: