"Як працює thisі $scopeпрацює в контролерах AngularJS?"
Коротка відповідь :
this
- Коли викликається функція конструктора контролера,
thisє контролером.
- Коли функція, визначена на
$scopeоб'єкті, викликається, thisце "область дії, коли функція викликалася". Це може бути (а може і не бути!), $scopeЩо функція визначена на. Отже, всередині функції може бути thisі не однаково.$scope
$scope
- Кожен контролер має пов'язаний
$scopeоб’єкт.
- Функція контролера (конструктора) відповідає за встановлення властивостей моделі та функцій / поведінки на пов'язаних з ними
$scope.
- З
$scopeHTML / перегляду доступні лише методи, визначені на цьому об'єкті (та батьківські об'єкти, якщо прототипне успадкування відтворюється). Наприклад, від 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-перемикач і директиви можуть створити власні дочірні області.