다음 컨트롤러가있는 경우 :
function parent($scope, service) {
$scope.a = 'foo';
$scope.save = function() {
service.save({
a: $scope.a,
b: $scope.b
});
}
}
function child($scope) {
$scope.b = 'bar';
}
parent
읽을 수있는 적절한 방법 b
은 child
무엇입니까? b
in 을 정의 할 필요가 있다면, 그것이 관련이있는 것이 아닌 무언가를 설명하는 속성 parent
이라고 가정하면 의미 론적으로 잘못 되지 않습니까?b
child
parent
업데이트 : 어린이가 두 명 이상이 있다면, 그것에 대해 더 생각 b
이에 대한 충돌 만들 것입니다 parent
어떤에서 b
검색 할 수 있습니다. 내 질문이 남아 있습니다. 올바른 액세스 방법 b
은 parent
무엇입니까?
답변
AngularJS의 스코프는 프로토 타입 상속을 사용합니다. 자식 스코프에서 속성을 찾을 때 인터프리터는 자식에서 시작하여 프로토 타입 체인을 찾고 그 반대가 아니라 속성을 찾을 때까지 부모로 계속합니다.
문제에 대한 Vojta의 의견 확인 https://groups.google.com/d/msg/angular/LDNz_TQQiNE/ygYrSvdI0A0J
간단히 말해서 : 부모 범위에서 자식 범위에 액세스 할 수 없습니다.
솔루션 :
- 부모에서 속성을 정의하고 자식에서 액세스합니다 (위 링크 참조).
- 서비스를 사용하여 상태 공유
- 이벤트를 통해 데이터를 전달합니다.
$emit
루트 범위까지 이벤트를 부모에게 위쪽으로 보내고$broadcast
아래쪽으로 이벤트를 전달합니다. 이것은 의미 상 올바른 것을 유지하는 데 도움이 될 수 있습니다.
답변
jm-의 대답이이 경우를 처리하는 가장 좋은 방법이지만 향후 참조를 위해 범위의 $$ childHead, $$ childTail, $$ nextSibling 및 $$ prevSibling 멤버를 사용하여 하위 범위에 액세스 할 수 있습니다. 이들은 문서화되어 있지 않으므로 예고없이 변경 될 수 있지만 실제로 범위를 통과해야하는 경우 존재합니다 .
// get $$childHead first and then iterate that scope's $$nextSiblings
for(var cs = scope.$$childHead; cs; cs = cs.$$nextSibling) {
// cs is child scope
}
답변
이것을 시도 할 수 있습니다.
$scope.child = {} //declare it in parent controller (scope)
그런 다음 자식 컨트롤러 (범위)에서 다음을 추가합니다.
var parentScope = $scope.$parent;
parentScope.child = $scope;
이제 부모는 자식의 범위에 액세스 할 수 있습니다.
답변
한 가지 가능한 해결 방법은 init 함수를 사용하여 부모 컨트롤러에 자식 컨트롤러를 삽입하는 것입니다.
가능한 구현 :
<div ng-controller="ParentController as parentCtrl">
...
<div ng-controller="ChildController as childCtrl"
ng-init="ChildCtrl.init()">
...
</div>
</div>
어디에서 ChildController
당신은 :
app.controller('ChildController',
['$scope', '$rootScope', function ($scope, $rootScope) {
this.init = function() {
$scope.parentCtrl.childCtrl = $scope.childCtrl;
$scope.childCtrl.test = 'aaaa';
};
}])
이제에서 다음 ParentController
을 사용할 수 있습니다.
app.controller('ParentController',
['$scope', '$rootScope', 'service', function ($scope, $rootScope, service) {
this.save = function() {
service.save({
a: $scope.parentCtrl.ChildCtrl.test
});
};
}])
중요 :
제대로 작동하려면 지시문을 사용 하고 html에서했던 것처럼 ng-controller
각 컨트롤러의 이름을 바꿔야합니다 as
.
팁 : 프로세스 중에
크롬 플러그인 ng-inspector를 사용하십시오 . 나무를 이해하는 데 도움이 될 것입니다.
답변
$ emit 및 $ broadcast 사용 (위의 주석에서 walv에 의해 언급 됨)
이벤트를 위쪽으로 시작하려면 (자식에서 부모로)
$scope.$emit('myTestEvent', 'Data to send');
이벤트를 아래쪽으로 시작하려면 (부모에서 자식으로)
$scope.$broadcast('myTestEvent', {
someProp: 'Sending you some data'
});
마지막으로 들어
$scope.$on('myTestEvent', function (event, data) {
console.log(data);
});
자세한 내용은 : -https : //toddmotto.com/all-about-angulars-emit-broadcast-on-publish-subscribing/
즐겨 🙂
답변
예, 자식 컨트롤러의 변수를 부모 컨트롤러의 변수에 할당 할 수 있습니다. 이것은 가능한 한 가지 방법입니다.
개요 : 아래 코드의 주요 목적은 자식 컨트롤러의 $ scope.variable을 부모 컨트롤러의 $ scope.assign에 할당하는 것입니다.
설명 : 두 개의 컨트롤러가 있습니다. html에서 부모 컨트롤러가 자식 컨트롤러를 포함하고 있음을 알 수 있습니다. 즉, 상위 컨트롤러가 하위 컨트롤러보다 먼저 실행됩니다. 따라서 먼저 setValue ()가 정의되고 컨트롤이 자식 컨트롤러로 이동합니다. $ scope.variable은 “하위”로 할당됩니다. 그런 다음이 자식 범위는 부모 컨트롤러의 기능에 인수로 전달됩니다. 여기서 $ scope.assign은 값을 “child”로 가져옵니다.
<!DOCTYPE html>
<html>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.6.4/angular.min.js"></script>
<script type="text/javascript">
var app = angular.module('myApp',[]);
app.controller('child',function($scope){
$scope.variable = "child";
$scope.$parent.setValue($scope);
});
app.controller('parent',function($scope){
$scope.setValue = function(childscope) {
$scope.assign = childscope.variable;
}
});
</script>
<body ng-app="myApp">
<div ng-controller="parent">
<p>this is parent: {{assign}}</p>
<div ng-controller="child">
<p>this is {{variable}}</p>
</div>
</div>
</body>
</html>