"어떻게 this
및 $scope
AngularJS와 컨트롤러에서 사용할 수 있습니까?"
짧은 답변 :
this
- 컨트롤러 생성자 함수가 호출되면
this
컨트롤러입니다.
$scope
객체 에 정의 된 this
함수가 호출 될 때 "함수가 호출 될 때 적용되는 범위"입니다. 이것은 $scope
함수가 정의 된 것일 수도 있습니다 . 따라서, 함수 내에서, this
그리고 $scope
수 없는 동일합니다.
$scope
- 모든 컨트롤러에는 관련
$scope
개체가 있습니다.
- 컨트롤러 (생성자) 기능은 모델 속성 및 관련 기능 / 동작을 설정합니다
$scope
.
- 이
$scope
객체 에 정의 된 메소드 (및 프로토 타입 상속이 사용중인 경우 상위 범위 객체) 만 HTML / 뷰에서 액세스 할 수 있습니다. 예 : ng-click
필터 등
긴 대답 :
컨트롤러 함수는 JavaScript 생성자 함수입니다. 생성자 함수가 실행될 때 (예를 들어, 뷰가로드 될 때), this
즉 "함수 컨텍스트"는 컨트롤러 객체로 설정된다. addPane 함수가 생성 될 때 "탭"컨트롤러 생성자 함수에서
this.addPane = function(pane) { ... }
$ scope가 아닌 컨트롤러 객체에서 생성됩니다. 뷰는 addPane 함수를 볼 수 없습니다. $ scope에 정의 된 함수에만 액세스 할 수 있습니다. 즉, HTML에서는 작동하지 않습니다.
<a ng-click="addPane(newPane)">won't work</a>
"탭"컨트롤러 생성자 함수가 실행되면 다음과 같은 결과가 나타납니다.
파선으로 표시된 검은 선은 프로토 타입 상속을 나타냅니다. 격리 범위는 프로토 타입으로 Scope 에서 상속됩니다 . (이 명령은 HTML에서 지시어가 발생한 범위에서 프로토 타입으로 상속되지 않습니다.)
이제 pane 지시문의 링크 함수는 tabs 지시문과 통신하려고합니다 (실제로 어떤 식 으로든 탭이 $ scope를 분리하는 데 영향을 주어야 함). 이벤트를 사용할 수 있지만 또 다른 메커니즘은 창 지시문 require
에 탭 컨트롤러 를 두는 것 입니다. ( require
$ scope 탭 에 대한 pane 지시문에 대한 메커니즘이없는 것 같습니다 .)
따라서 이것은 질문을 제기합니다 : 탭 컨트롤러에만 액세스 할 수 있다면 탭에 어떻게 액세스하여 $ scope를 분리합니까 (실제로 원하는 것입니까)?
빨간색 점선이 그 답입니다. addPane () 함수의 "scope"(여기서는 JavaScript의 함수 범위 / 클로저를 참조하고 있습니다)는 탭 격리 $ scope에 대한 액세스 권한을 제공합니다. 즉, addPane ()은 addPane ()이 정의 될 때 생성 된 클로저로 인해 위의 다이어그램에서 "탭 IsolateScope"에 액세스 할 수 있습니다. (대신에 $ scope 객체 탭에서 addPane ()을 정의하면 pane 지시문이이 함수에 액세스 할 수 없으므로 $ scope 탭과 통신 할 방법이 없습니다.)
질문의 다른 부분에 대답하려면 how does $scope work in controllers?
:
$ scope에 정의 된 함수 내 this
에서 "함수가 호출 된 시점 및 시점에 적용되는 $ scope"로 설정됩니다. 다음 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
(Solely)는
$scope.logThisAndScope = function() {
console.log(this, $scope)
}
첫 번째 링크를 클릭하면 그 표시됩니다 this
및 $scope
"이후, 동일 함수가 호출 유효한 범위 의"와 연관된 범위이다 ParentCtrl
.
제 2 링크를 클릭하면 계시 this
하고 $scope
있는 없다 "때문에, 동일한 함수가 호출 유효한 범위 의"와 연관된 범위이다 ChildCtrl
. 그래서 여기 this
로 설정 ChildCtrl
의 ' $scope
. 메소드 안에는 $scope
여전히 ParentCtrl
$ 범위입니다.
깡깡이
this
ng-repeat, ng-include, ng-switch 및 지시문이 모두 자체 자식 범위를 만들 수 있다는 점을 고려하여 $ scope에 정의 된 함수 내부를 사용하지 마십시오 .