프리미티브 "항목"에 대한 데이터 바인딩이 작동하지 않는 이유는 ng-repeat가 각 항목에 대해 하위 범위를 만드는 방식 때문입니다. 각 항목에 대해 ng-repeat에는 상위 범위 (기본 그림의 점선 참조)에서 상속받은 새 하위 범위가 있고 및 하위 항목의 새 속성에 항목 값이 할당됩니다 (아래 그림의 빨간색 항목). 새 속성의 이름은 루프 변수의 이름입니다. ng-repeat source code에서 : 항목이 원시적 인 경우
childScope = scope.$new();
...
childScope[valueIdent] = value;
, 새로운 아이 범위 속성은 본질적으로의 프리미티브 값의 사본을 할당됩니다. 이 하위 범위 속성은 부모 범위에서 볼 수 없으며 입력 필드에 대한 변경 사항은이 하위 범위 속성에 저장됩니다.
<div ng-repeat="item in list">
그런 다음, 첫 번째 자식 범위가 기본 값으로, (value 1
를) 다음 item
속성을했을 :
예, 우리는 부모 범위
$scope.list = [ 'value 1', 'value 2', 'value 3' ];
에있는 그리고 HTML의 가정
item: "value 1"
ng-model 데이터 바인딩으로 인해 양식의 입력 필드에 대한 변경 사항이 해당 하위 범위 속성에 저장됩니다.
콘솔에 하위 범위를 기록하여이를 확인할 수 있습니다.
<a ng-click="showScope($event)">show scope</a>
컨트롤러에 추가 : 다음 NG 반복 안에, 당신의 HTML에 추가
$scope.showScope = function(e) {
console.log(angular.element(e.srcElement).scope());
}
을 Gloopy의 접근 @를 통해 각 아동의 범위는 여전히 새 "항목"속성을 얻을 수 있지만, 이제 list가 객체 배열이므로
childScope[valueIdent] = value;
은 item 속성의 값이 배열 객체 중 하나 (사본이 아님)에 대한 참조로 설정되도록합니다. showScope() 기술을 사용하여
, 당신은 자식 범위
item
속성의 값이 배열 개체 중 하나를 참조하는 것을 볼 수 있습니다 - 더 이상 원시적 값입니다.
도 참조하십시오. don't bind to primitives in ng-repeat child scopes 및
What are the nuances of scope prototypal/prototypical inheritance in AngularJS? (ng-repeat를 사용할 때 범위의 그림이 포함되어 있음)
하나의 입력 상자가 작동하고 각 항목을 구분 기호로 구분하면 ngList를 참조하십시오. http://docs.angularjs.org/api/ng.지시문 : ngList –
현재 개발중인 내용에 대해 직관적이지는 않지만, angular가이 기능을 미래에 사용할 수있는 지시문으로 사용한다는 사실을 알고있는 것이 좋습니다. 감사! – rcell