[html] ng-include를 사용할 때 범위 상실
이 모듈 경로가 있습니다.
var mainModule = angular.module('lpConnect', []).
config(['$routeProvider', function ($routeProvider) {
$routeProvider.
when('/home', {template:'views/home.html', controller:HomeCtrl}).
when('/admin', {template:'views/admin.html', controller:AdminCtrl}).
otherwise({redirectTo:'/connect'});
}]);
홈 HTML :
<div ng-include src="views.partial1"></div>
partial1
HTML :
<form ng-submit="addLine()">
<input type="text" ng-model="lineText" size="30" placeholder="Type your message here">
</form>
HomeCtrl
:
function HomeCtrl($scope, $location, $window, $http, Common) {
...
$scope.views = {
partial1:"views/partial1.html"
};
$scope.addLine = function () {
$scope.chat.addLine($scope.lineText);
$scope.lines.push({text:$scope.lineText});
$scope.lineText = "";
};
...
}
이 addLine
함수 $scope.lineText
는 undefined
에 추가 ng-controller="HomeCtrl"
하여 해결할 수 partial1.html
있지만 컨트롤러가 두 번 호출됩니다. 내가 여기서 무엇을 놓치고 있습니까?
답변
이것은 ng-include
새로운 자식 범위를 생성 하기 때문에 $scope.lineText
변경되지 않습니다. 나는 그것이 this
현재 범위 를 참조 한다고 생각 하므로 this.lineText
설정해야합니다.
답변
@Renan이 언급했듯이 ng-include는 새로운 자식 범위를 만듭니다. 이 범위는 HomeCtrl 범위에서 프로토 타입으로 상속됩니다 (아래 점선 참조). ng-model="lineText"
실제로 HomeCtrl의 범위가 아닌 자식 범위에 기본 범위 속성을 만듭니다. 이 하위 범위는 부모 / HomeCtrl 범위에서 액세스 할 수 없습니다.
사용자가 HomeCtrl의 $ scope.lines 배열에 입력 한 내용을 저장하려면 addLine 함수에 값을 전달하는 것이 좋습니다.
<form ng-submit="addLine(lineText)">
또한 lineText는 ngInclude 범위 / 부분이 소유하고 있으므로 삭제해야 할 책임이 있다고 생각합니다.
<form ng-submit="addLine(lineText); lineText=''">
따라서 addLine () 함수는 다음과 같습니다.
$scope.addLine = function(lineText) {
$scope.chat.addLine(lineText);
$scope.lines.push({
text: lineText
});
};
바이올린 .
대안 :
- HomeCtrl의 $ scope에서 객체 속성을 정의하고 부분적으로 사용하십시오
ng-model="someObj.lineText
.; 깡깡이 - 권장하지 않습니다. 이것은 더 많은 해킹입니다. 부분적으로 $ parent를 사용
lineText
하여 HomeCtrl $ scope 에서 속성 을 만들거나 액세스합니다ng-model="$parent.lineText"
. 깡깡이
위의 두 가지 대안이 작동하는 이유를 설명하는 데 약간 관여하지만 AngularJS에서 스코프 프로토 타입 / 프로토 타입 상속의 뉘앙스는 무엇입니까?
this
addLine () 함수를 사용하지 않는 것이 좋습니다 . 어느 스코프가 액세스 / 조작되는지 명확하지 않습니다.
답변
this
허용되는 답변이 제안 하는 대로 사용하는 $parent
대신 대신 사용하십시오. 따라서 partial1.html
당신은 다음을 가질 것입니다 :
<form ng-submit="$parent.addLine()">
<input type="text" ng-model="$parent.lineText" size="30" placeholder="Type your message here">
</form>
범위 ng-include
또는 다른 지시문 에 대한 자세한 내용은 https://github.com/angular/angular.js/wiki/Understanding-Scopes#ng-include를 참조하십시오.
답변
부모와 하위 범위 데이터를 혼합하지 않고이 문제를 해결하는 방법을 알아 냈습니다. 요소 ng-if
에 a 를 ng-include
설정하고 범위 변수로 설정하십시오. 예를 들면 다음과 같습니다.
<div ng-include="{{ template }}" ng-if="show"/>
컨트롤러에서 하위 범위에 필요한 모든 데이터를 설정 한 후 show를로 설정하십시오 true
. 그만큼ng-include
현재 범위에서 설정 한 데이터를 복사하여 하위 범위에서 설정합니다.
경험상 스코프 데이터가 스코프 범위를 더 깊게 줄이려면 그렇지 않으면이 상황이 발생합니다.
맥스