각도 적용에서는 각 항목에 대해 ng-repeat 및 하위 컨트롤러를 사용하고 있습니다. 나는 또한 자동으로 데이터를 저장할 수 있도록 debounce를 사용하고있다. 그러나 문제는 데이터를 저장 한 후 (Restangular 사용) 변경 사항이 상위 노드의 배열로 다시 전파되지 않는다는 것입니다. 간단한 예제는 angular.copy
을 사용하여 작동하지만 Restangular 및 해당 대체 (Restangular.copy
) 문제는 정확히 같은 방식으로 작동하지 않습니다. 명시 적으로 항목을 배열의 오른쪽 인덱스로 설정하려고했지만 커서가 입력에 포커스를 잃게됩니다.Angular.js : ng-repeat 내부의 자식 컨트롤러에서 모델 변경 사항을 전파하는 방법
다음은 내 자식 컨트롤러 코드의 단순화 된 버전입니다. 및 here is a full JS Bin. 이 문제를 해결하기위한 또 다른 접근법이 있습니까?
<li ng-repeat='person in people track by $index' ng-controller='EditPersonController'>
: 당신이 당신의 NG 반복에 "에 의해 트랙"을 추가하면
$scope.personCopy = angular.copy($scope.person);
// Debounce and auto-save changes
$scope.$watch('personCopy', function(newVal, oldVal) {
if (newVal && newVal != oldVal) {
if (timeout) $timeout.cancel(timeout);
timeout = $timeout(savePerson, 1000);
}
}, true);
var savePerson = function() {
// (In my real app, the following is inside a save callback)
// Method 1: (doesn't work at all)
$scope.person = $scope.personCopy
// Method 2: (works with angular.copy, but not Restangular.copy)
// angular.copy($scope.personCopy, $scope.person);
// Method 3: (works, but cursor loses focus)
// $scope.people[$scope.$index] = $scope.personCopy;
};
아마도 지시어를 사용하는 것이 더 쉬울까요? 사용자 인스턴스를 "기본"범위에 연결하는 범위와 함께 지시자에 사용자 컨트롤러를 배치 할 수 있습니다. 변경 사항은 양방향 바인딩을 사용하여'$ scope'를 통해 자동으로 전파됩니다. – Mikke
좋은 지적이지만 내 호기심에 대해 양방향 바인딩이 어떻게 뒤에서 작동하는지 알고 있습니까? –
'nodeLinkFn'에서 6200 (v1.2.14) 줄의'angular.js'를보십시오. 기본적으로'$ scope. $ watch'가 있습니다. – Mikke