Angular에서 변경된 입력 필드를 표시하는 방법JS
API에 데이터를 PUT하는 편집 폼(user.html)을 만들고 있습니다만, 폼의 모든 데이터를 PUT하는 것은 피하고 싶습니다.변경된 아이템만 넣어주세요.
폼으로 작업할 때 더럽고 깨끗한 것을 사용하는 것을 본 적이 있지만, 이는 폼의 모든 변경에 적용됩니다.ng-change의 사용도 보았습니다만, 1개의 요소에 대한 변경으로 액션을 트리거 하는 것은 아닙니다.변경된 요소를 PUT에 포함해야 한다는 것을 나타내고 있을 뿐입니다.
변경된 입력 필드만 표시할 수 있는 방법을 찾은 사람?
에 입력을 입력했을 경우form와 함께nameAtribute를 지정한 후 입력에 Atribute를 부여합니다.nameAtribute, 입력에 액세스도 액세스 할 수 있습니다.$pristine소유물.
<div ng-controller="MyController">
<form name="myForm">
<input type="text" name="first" ng-model="firstName">
<input type="text" name="last" ng-model="lastName">
</form>
</div>
app.controller('MyController', function($scope) {
// Here you have access to the inputs' `$pristine` property
console.log($scope.myForm.first.$pristine);
console.log($scope.myForm.last.$pristine);
});
사용할 수 있습니다.$scope.myForm.$pristine변경된 필드가 없는지 확인하고$pristine해당 입력이 변경되었는지 확인하기 위해 양식에 있는 각 입력의 속성에서 속성을 선택합니다.반복할 수도 있습니다.myFormobject(비입력필드 오브젝트에는 키 프리픽스가 부가되어 있습니다).$):
angular.forEach($scope.myForm, function(value, key) {
if(key[0] == '$') return;
console.log(key, value.$pristine)
});
// first, true
// last, false
사용자가 설정/정보를 갱신할 수 있도록 할 때 더 많은 기능을 필요로 하는 경우가 많습니다.예를 들어, 정보를 리셋하거나 편집을 취소하고 되돌리는 기능 등이 있습니다.요청 사항이 아닌 건 알지만, 이 점을 고려하시면 다른 일이 쉬워집니다.
저장된 값을 저장하고 편집된 값을 가지고 있으면 값이 변경되지 않으므로 저장된 값으로 재설정할 수 있습니다.그런 다음 두 가지를 비교하여 무엇이 변경되었는지 확인할 수 있습니다.
작업 예: http://jsfiddle.net/TheSharpieOne/nJqTX/2/
콘솔 로그를 참조하여 예제의 폼을 전송했을 때 변경된 내용을 확인합니다.PUT으로 쉽게 보낼 수 있는 물건입니다.
function myCtrl($scope) {
$scope.user = {
firstName: "John",
lastName: "Smith",
email: "john.smith@example.com"
};
$scope.reset = function () {
angular.copy($scope.user, $scope.edit);
};
$scope.submitForm = function(){
console.log(findDiff($scope.user, $scope.edit));
// do w/e to save, then update the user to match the edit
angular.copy($scope.edit, $scope.user);
};
function findDiff(original, edited){
var diff = {}
for(var key in original){
if(original[key] !== edited[key])
diff[key] = edited[key];
}
return diff;
}
}
주의: findDiff는 단순합니다.두 개체의 키가 같고 값만 변경되었다고 가정합니다.동일한 오브젝트에 대한 2개의 참조가 아니라 실제로는 2개의 오브젝트가 되도록 오브젝트를 복사합니다.
이전 스레드이지만 TheSharpieOne의 답변을 기반으로 구축하려면 "===" 대신 angular.timeout을 사용하여 동일성을 확인하는 것이 좋습니다. 그렇지 않으면 어레이에서 작동하지 않습니다.
function findDiff(original, edited){
var diff = {}
for(var key in original){
if(!angular.equals(original[key], edited[key]))
diff[key] = edited[key];
}
return diff;
}
사용할 수 있습니다.$scope.$watch('scopeVariable', function(oldValue, newValue)...)다음 중 하나만을 포함하는 개체를 만듭니다.newValue와는 다른oldValues.
여기 $watch에 관한 Angular docs 링크입니다.
ARN과 The SharpieOne의 답변을 바탕으로 구축.프로젝트에서 밑줄을 사용하는 경우 이 방법을 사용하여 개체 배열의 차이를 찾을 수 있습니다.
function findDiff(original, edited){
_.filter(original, function(obj){ return !_.findWhere(edited, obj); });
}
송신 이벤트에서 변경된 값으로만 객체를 취득하는 간단한 방법:
var dirtyInput = $('#myForm .ng-dirty');
var change = {};
for (var i = 0; i < dirtyInput.length; i++) {
change[dirtyInput[i].name] = dirtyInput[i].value;
}
The Sharpie One의 답변에 추가.원본과 편집된 항목이 다른 이유는 편집된 개체에 추가된 새 필드 때문일 수도 있습니다.따라서 동일한 항목에 대한 추가 검사
function findDiff(original, edited){
var diff = {}
for(var key in original){
if(!angular.equals(original[key], edited[key]))
diff[key] = edited[key];
}
for(var key in edited){
if(!angular.equals(original[key], edited[key]))
diff[key] = edited[key];
}
return diff;
}
언급URL : https://stackoverflow.com/questions/18641618/how-can-i-denote-which-input-fields-have-changed-in-angularjs
'source' 카테고리의 다른 글
| Angularjs ng-click: 이 데이터를 얻는 방법 (0) | 2023.03.21 |
|---|---|
| Jackson의 @JsonSubTypes는 다형성 디시리얼라이제이션에 여전히 필요한가요? (0) | 2023.03.21 |
| 설정 변수를 지정합니다.php 단, 바닥글에는 표시되지 않습니다.php (0) | 2023.03.21 |
| JSON 요소 접근 (0) | 2023.03.21 |
| 알 수 없는 공급자: $modalProvider <- 각도에서의 $modal 오류JS (0) | 2023.03.21 |