Gostaria de vincular um elemento select a uma lista de objetos - o que é bastante fácil:
@Component({
selector: 'myApp',
template: `<h1>My Application</h1>
<select [(ngModel)]="selectedValue">
<option *ngFor="#c of countries" value="c.id">{{c.name}}</option>
</select>`
})
export class AppComponent{
countries = [
{id: 1, name: "United States"},
{id: 2, name: "Australia"}
{id: 3, name: "Canada"},
{id: 4, name: "Brazil"},
{id: 5, name: "England"}
];
selectedValue = null;
}
Nesse caso, parece que selectedValue
seria um número - o ID do item selecionado.
No entanto, eu realmente gostaria de vincular ao próprio objeto do país, para que esse selectedValue
seja o objeto, e não apenas o ID. Tentei alterar o valor da opção da seguinte forma:
<option *ngFor="#c of countries" value="c">{{c.name}}</option>
mas isso não parece funcionar. Parece colocar um objeto no meu selectedValue
- mas não o objeto que estou esperando. Você pode ver isso no meu exemplo do Plunker .
Também tentei vincular o evento de alteração para poder definir o objeto com base no ID selecionado; no entanto, parece que o evento de alteração é acionado antes que o ngModel ligado seja atualizado - o que significa que não tenho acesso ao novo valor selecionado nesse momento.
Existe uma maneira limpa de vincular um elemento de seleção a um objeto com Angular 2?
Respostas:
Exemplo de StackBlitz
NOTA: você pode usar em
[ngValue]="c"
vez de[ngValue]="c.id"
onde c é o objeto completo do país.[value]="..."
suporta apenas valores de cadeia de caracteres[ngValue]="..."
suporta qualquer tipoatualizar
Se
value
for um objeto, a instância pré-selecionada precisará ser idêntica a um dos valores.Consulte também a comparação personalizada adicionada recentemente, https://github.com/angular/angular/issues/13268 disponível desde 4.0.0-beta.7
Cuide se você deseja acessar
this
dentrocompareFn
.fonte
selectedValue
além de parac
(o item padrão). Um objeto diferente, mesmo com as mesmas propriedades e valores, não funciona, deve ser a mesma instância do objeto.Isso pode ajudar:
fonte
let
vez de#
@ sea-kgVocê também pode fazer isso sem a necessidade de usar
[(ngModel)]
em sua<select>
tagDeclare uma variável no seu arquivo ts
toStr = JSON.stringify;
e no seu modelo faça isso
e depois use
analisar a sequência novamente em um objeto JavaScript válido
fonte
Funcionou para mim:
HTML do modelo:
Eu adicionei
(ngModelChange)="selectChange($event)"
ao meuselect
.Em component.ts:
Você precisa adicionar a
component.ts
esta função:Nota: eu tento com
[select]="oneOption.id==model.myListOptions.id"
e não trabalho.============= Outras formas podem ser: =========
HTML do modelo:
Eu adicionei
[compareWith]="compareByOptionId
ao meuselect
.Em component.ts:
Você precisa adicionar a
component.ts
esta função:fonte
[ngModel]
e definir seu modelo manualmente no retorno de chamada de alteração personalizado definido em(ngModelChange)
.Apenas no caso de alguém estar olhando para fazer o mesmo usando o Reactive Forms:
Veja aqui o exemplo de trabalho
fonte
Você pode selecionar o ID usando uma função
fonte
Para mim, está funcionando assim, você pode consolar
event.target.value
.fonte
Além disso, se nada mais de determinadas soluções não funcionar, verifique se você importou "FormsModule" dentro de "AppModule", isso foi uma chave para mim.
fonte
Crie outro getter para o item selecionado
Em st:
fonte
Você também pode obter o valor selecionado com a ajuda de click () passando o valor selecionado pela função
fonte
use dessa maneira também ..
fonte
Em
app.component.html
:E
app.component.ts
:fonte
essa abordagem sempre funcionará, no entanto, se você tiver uma lista dinâmica, carregue-a antes do modelo
fonte