Angular.js에서 이상한 기능/버그를 발견했습니다.ngOptions에서 사용되는 배열/객체가 비어 있음/정의되지 않음/null로 설정된 경우 ngChange 표현식이 평가됩니다.
옵션이 ngOptions 지시어로 채워지는 선택 상자가 있다고 가정합니다. ngChange 지시문을 사용하여 selectbox에 변경 리스너를 설정했습니다. 우리는 콘솔을 보면
$scope.list = [];
, 우리가 볼 수 있습니다 : 우리는 어딘가에 코드에서이 같은 배열을 다시
다음$scope.list = [1,2,3,4,5];
$scope.model = 3;
$scope.foo = function() {
console.log("change");
};
다음과 같이
<select ng-model="model" ng-options="item for item in list" ng-change="foo()"></select>
우리는 범위를 정의 함수 foo()
이 호출되었고 텍스트 "change"
이 로깅되었습니다. 그러나 사용자는 선택 상자를 터치하지 않았고 선택한 값을 변경하지 않았습니다. 문서
를 변경하여 프로그래밍이 아닌 변경되면입력 값의 변화가 모델에 전념 할 새로운 값을 발생하면 ngChange 발현만을 평가하는 방법.
그것은 평가되지 않습니다 :
- 입력이 모델이 null을 유지하기 때문에 무효로 계속 경우 값이
- 변경되지 않은 $ 파서 변환 파이프 라인에서 반환 된 경우
- 모형은 입력 값
입력 값이 이 아니고이 변경되었습니다. 모델은 이 아니며이 변경되었습니다. 옵션을 생성하는 데 사용 된 배열 (객체가있는 동일한 동작) 만 프로그래밍 방식으로으로 변경되었습니다.
는 select
요소를 검사함으로써 또한 ng-dirty
클래스 (클래스 ng-untouched
이 아직 설정) 사용자가 선택 박스를 만진 적이에도 불구하고, 요소에 설정된 것을 발견했다.
왜 이런 일이 발생합니까? 내가 이해할 수없는 이상한 기능입니까 아니면 버그입니까? 내가 뭔가 잘못하고 있는거야? 이 문제에 대한 해결책을 알고 있습니까?
옵션을 생성하는 데 사용되는 배열을 수정하자마자 ** 입력 값 **이 변경됩니다. – Lex
그건 사실이 아니야. 어쨌든 (배열 추가/제거, 전체 배열 대체) 배열을 수정할 수 있으며 모델은 변경되지 않습니다. ngChange 표현식은 평가되지 않습니다. 그리고 이것은 예상되는 행동입니다. 비어있는/정의되지 않은/null 배열/개체 만 예기치 않은 동작을 일으 킵니다. – KDPV
'$ scope.model = 3;'이 (가) 있습니다. 보기에서'{{model}}'을 넣고'$ scope.list = []'를 설정 한 코드를 호출 할 때 변경 사항을 관찰하십시오. – Lex