이 질문의 맛은 출시하기 전에 Angular2의 다양한 버전에서 여러 번 묻습니다. 그러나, 나는 아직 여기에 큰소리로 원하는 행동 (부족한 해결 방법의 부족)을 생산할만한 것을 찾지 못했습니다. Select Object Problemsangular2 ngModel/ngValue 옵션 개체 - 다른 인스턴스에서 동일 함을 나타냅니다.
내 양식 선택은 [(ngModel)]을 (를) 통해 객체를 생성 한 다음 비슷한 객체 (모두 ID로 구별됨)의 목록을 보려면 * ngFor를 통해 'option'이 생성됩니다. 내 연구에서 Angular2가 (인스턴스에 의해) JavaScript 객체 등가성을 사용한다는 것을 여러 번 언급 했으므로 동일한 인스턴스가없는 바인딩 된 모델의 객체는 목록과 일치하지 않습니다. 따라서 "2-way"데이터 바인딩을 깨는 "선택된"항목으로 표시되지 않습니다.
그러나이 인스턴스가 일치하는 방법을 정의하고 싶습니다. 인터넷에서 떠 다니는 일부 솔루션이 시도되었지만 작은 조각이 누락되었거나 제대로 구현되지 않았습니다.
- ngModel에서 개체 (즉 ID) 이외의 다른 바인딩 :
옵션은 내가 피하려고. ngValue는 유용한 활용입니다.
- 변경 핸들러를 통한 해결 방법
- 인스턴스가 일치하도록합니다 (데이터 서비스에서 개체를 가져오고 있으며 모두 일치하도록 재정의하고 싶지는 않습니다 ...). 자원의 불필요한 낭비 같은)
이상적으로 (솔루션 - 내 솔루션이 부족한 솔루션이있는 곳에서 가능한 한 논의 된 것 같습니다.) ngModel에 대한 평등 표준을 정의 할 수 있습니다. 오브젝트 인스턴스 평등 대신에 사용하십시오.
즉, 아래의 최신 시도입니다. 여기서 h.id == a.id는 "selected"속성을 정의합니다. 왜 "selected"속성이 렌더링되지 않는지 이해할 수 없습니다. ngModel에 의해 어떻게 든 차단됩니까? HTML에서 selected = 'true'를 수동으로 설정하는 것은 수정하는 것처럼 보이지만 [attr.selected] 또는 ng-reflect-selected = 'true'속성을 만드는 다른 변형으로 생성하는 것은 트릭을 수행하지 않는 것 같습니다.
<div *ngFor='let a of activePerson.hobbyList ; let i=index; trackBy:a?.id'>
<label for='personHobbies'>Hobby:</label>
<select id='personHobbies' class='form-control'
name='personHobbies' [(ngModel)]='activePerson.hobbyList[i]' #name='ngModel'>
<option *ngFor='let h of hobbyListSelect; trackBy:h?.id'
[ngValue]='h'
[attr.selected]='h.id == a.id ? true : null'
>
{{h.name}}
</option>
</select>
</div>
어떤 것들은 내가 시도 :
- trackBy을
- [선택] = 선택은 = {{}}이, 그리고 [attr.selected (이 보인다 닫기) 에 바인딩
:
<select ...>
<option selected='true'>Selected</option>
<option selected='false'>Not Selected</option>
<!-- and variants, excluding with selected=null-->
</select>
0123을
개체 인스턴스가 다른 경우에도 여전히 선택된 값이 없습니다. 나는 또한 사용자가 값을 선택할 때 HTML 또는 CSS의 어떤 요소가 선택된 값을 기록하는지 알아 내려고 시도했다. (ngModel이 처리하는 방법과 처리 할 수있는 다른 옵션이 무엇인지).
도움을 주시면 감사하겠습니다. 목표는 기본 모델을 변경하고 그에 따라 선택 상자를 업데이트하기 위해 "변경"단추를 얻는 것입니다. "hobbyList"에 대한 내 시도에 집중했습니다. Firefox와 Chrome에서 사용해 보았습니다. 감사!당신이 선택한 일을 할 곳에서 전달 된 객체를 얻을 때
을, 나는 그 [이] (HTTP를 발견했습니다 : //stackoverflow.com/questions/37728121/angular2-select-initial-object-with-ngvalue)는 완전히 사실입니다. 그러나 ngValue를 사용하고 두 객체를 비교할 때 초기 선택 옵션을 설정하는 방법이 있어야합니다. – BuddhistBeast
단순히 기존 배열 데이터를 업데이트하고 새 데이터를 만드는 대신 사용하십시오. 새로운 개체를 만들면 기존 기능을 손상시킬 수 있습니다. 거기에 아무런 문제가 없으며 문자열 기본 요소 대신 객체를 비교하고 있습니다 (예상 한대로). 원하는 것을 얻기 위해 프로토 타입을 수정해야하지만 올바른 방법은 모델 데이터를 업데이트하는 것입니다. 개체 대신 ID 번호 또는 문자열 배열을 사용할 수도 있으며 그렇게하면 잘 작동합니다. – Kesarion
선택할 수있는 옵션의 배열은 객체 자체와 별도의 데이터 서비스에서 나옵니다. ngValue를 사용하여 프레임 워크와 일관된 방식으로 작업하고 싶지만 프레임 워크가 지원하지 않으면 명확하게 해결해야합니다. 솔직히 "selected"속성을 강요하면 원하는 동작이 제공되지 않습니다. 개발자 모드에서 "selected = true"를 입력하면 원하는대로 작동하지만 angular2를 통해 동일한 작업을 수행하지는 않습니다. 또한, angular2를 통해 시도하면 개발자 모드 편집이 작동하지 않습니다. – cole