"Як працює this
і $scope
працює в контролерах AngularJS?"
Коротка відповідь :
this
- Коли викликається функція конструктора контролера,
this
є контролером.
- Коли функція, визначена на
$scope
об'єкті, викликається, this
це "область дії, коли функція викликалася". Це може бути (а може і не бути!), $scope
Що функція визначена на. Отже, всередині функції може бути this
і не однаково.$scope
$scope
- Кожен контролер має пов'язаний
$scope
об’єкт.
- Функція контролера (конструктора) відповідає за встановлення властивостей моделі та функцій / поведінки на пов'язаних з ними
$scope
.
- З
$scope
HTML / перегляду доступні лише методи, визначені на цьому об'єкті (та батьківські об'єкти, якщо прототипне успадкування відтворюється). Наприклад, від ng-click
, фільтри тощо.
Довга відповідь :
Функція контролера - це функція конструктора JavaScript. Коли виконується функція конструктора (наприклад, коли вигляд завантажується), this
(тобто "контекст функції") встановлюється об'єкт контролера. Так у функції конструктора контролера "вкладки", коли створена функція addPane
this.addPane = function(pane) { ... }
він створюється на об'єкті контролера, а не на $ range. Перегляди не можуть бачити функцію addPane - вони мають доступ лише до функцій, визначених у $ range. Іншими словами, в HTML це не працює:
<a ng-click="addPane(newPane)">won't work</a>
Після виконання функції конструктора контролерів "tabs" у нас є наступне:
Пунктирна чорна лінія вказує на прототипне успадкування - область ізоляції, прототипічно успадковується від Scope . (Це прототипно не успадковує сферу дії, де діють директиви в HTML.)
Тепер функція зв’язку директиви панелі хоче спілкуватися з директивою вкладок (що насправді означає, що їй потрібно певним чином впливати на ізоляцію вкладок $). Події можуть бути використані, але інший механізм полягає в тому, щоб директива панелі require
керувала вкладками. (Здається, не існує механізму для директиви панелі до require
вкладок $ range.)
Отже, тут виникає питання: якщо ми маємо доступ лише до контролера вкладок, як нам отримати доступ до вкладок ізолювати $ область (що саме ми насправді хочемо)?
Ну, червона пунктирна лінія - це відповідь. "Область" функції addPane () (я маю на увазі тут функцію / закриття функції JavaScript) надає функції функції доступ до вкладок ізолювати $ область. Тобто addPane () має доступ до "вкладок IsolateScope" на діаграмі вище через закриття, яке було створено, коли addPane () було визначено. (Якби ми замість цього визначили addPane () на вкладці $ range object, директива панелі не мала б доступу до цієї функції, і, отже, вона не мала б можливості спілкуватися з вкладками $ range.)
Щоб відповісти на іншу частину вашого питання how does $scope work in controllers?
:
У межах функцій, визначених у $ range, this
встановлено значення "область дії, де / коли функція викликалася". Припустимо, у нас є такий HTML:
<div ng-controller="ParentCtrl">
<a ng-click="logThisAndScope()">log "this" and $scope</a> - parent scope
<div ng-controller="ChildCtrl">
<a ng-click="logThisAndScope()">log "this" and $scope</a> - child scope
</div>
</div>
І ParentCtrl
(Єдино) є
$scope.logThisAndScope = function() {
console.log(this, $scope)
}
Клацання першого посилання покаже, що це this
і $scope
те саме, оскільки " область дії, яка функціонувала, коли функція викликалася ", є сферою, пов'язаною з ParentCtrl
.
При натисканні на другу посилання покаже , this
і $scope
це НЕ те ж саме, так як « сфера діє , коли функція була викликана » є областю , пов'язаний з ChildCtrl
. Отже, тут this
встановлено значення ChildCtrl
's $scope
. Всередині методу $scope
все ще знаходиться ParentCtrl
$ s.
Скрипка
Я намагаюся не використовувати this
всередині функції, визначеної на $ range, оскільки стає заплутаним, на який впливає область $, особливо враховуючи, що ng-повторення, ng-включення, ng-перемикач і директиви можуть створити власні дочірні області.