0

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이 아직 설정) 사용자가 선택 박스를 만진 적이에도 불구하고, 요소에 설정된 것을 발견했다.

왜 이런 일이 발생합니까? 내가 이해할 수없는 이상한 기능입니까 아니면 버그입니까? 내가 뭔가 잘못하고 있는거야? 이 문제에 대한 해결책을 알고 있습니까?

+0

옵션을 생성하는 데 사용되는 배열을 수정하자마자 ** 입력 값 **이 변경됩니다. – Lex

+0

그건 사실이 아니야. 어쨌든 (배열 추가/제거, 전체 배열 대체) 배열을 수정할 수 있으며 모델은 변경되지 않습니다. ngChange 표현식은 평가되지 않습니다. 그리고 이것은 예상되는 행동입니다. 비어있는/정의되지 않은/null 배열/개체 만 예기치 않은 동작을 일으 킵니다. – KDPV

+0

'$ scope.model = 3;'이 (가) 있습니다. 보기에서'{{model}}'을 넣고'$ scope.list = []'를 설정 한 코드를 호출 할 때 변경 사항을 관찰하십시오. – Lex

답변

0

당신이 목록을 설정하면 :이 입력 값을 변경하는 옵션 목록을 변경하기 때문에

$scope.list = []; 

이는 NG 변화를 트리거합니다.

으로 변경하지 않고 프로그래밍 방식으로 모델을 변경하면 으로 강조 표시되는 것을 볼 수 있습니다.

이 경우 프로그램 적으로 모델을 변경하지 않습니다.

+0

사실,이 경우 프로그램의 모델을 변경하지 않을 것입니다. Angular가 모델을 변경하고 있습니다. 무엇이 매우 중요합니다. 내 질문에 대한 내 의견을 참조하십시오. – KDPV