No Angular 1, eu poderia selecionar a opção padrão para uma caixa suspensa usando o seguinte:
<select
data-ng-model="carSelection"
data-ng-options = "x.make for x in cars" data-ng-selected="$first">
</select>
No Angular 2 eu tenho:
<select class="form-control" [(ngModel)]="selectedWorkout" (ngModelChange)="updateWorkout($event)">
<option *ngFor="#workout of workouts">{{workout.name}}</option>
</select>
Como posso selecionar uma opção padrão, considerando os dados de minha opção:
[{name: 'arm'}, {name: 'back'}, {name:'leg'}]
e meu valor I para o padrão é back
?
[(ngModel)]
ligação, portanto, ele escuta a[selected]
ligação no plnkr e não no código do OP (veja minha resposta para um link para um plnr bifurcado que explica esse efeito)selected="workout.name == 'back'"
reativos:[selected]=workout.name == 'back'
"
. Usei seu código com outra variável como esta[selected]="workout.name == exercise.name"
Se você atribuir o valor padrão a
selectedWorkout
e usar[ngValue]
(que permite usar objetos como valor - caso contrário, apenas string é suportado), então ele deve apenas fazer o que você deseja:Certifique-se de que o valor que você atribui
selectedWorkout
seja a mesma instância que o usado emworkouts
. Outra instância de objeto, mesmo com as mesmas propriedades e valores, não será reconhecida. Apenas a identidade do objeto é verificada.atualizar
Suporte angular adicionado para
compareWith
, que torna mais fácil definir o valor padrão quando[ngValue]
é usado (para valores de objeto)Dos documentos https://angular.io/api/forms/SelectControlValueAccessor
Desta forma, uma instância de objeto diferente (nova) pode ser definida como valor padrão e
compareFn
é usada para descobrir se eles devem ser considerados iguais (por exemplo, se aid
propriedade é a mesma.fonte
[value]
vez de[ngValue]
ou seu código de alguma forma faça com que o valor seja convertido em uma string.c1
ec2
indicar emcompareFn
? E também, como funciona a avaliação no corpo de funções?selectedCountries
ecountry
apenas defina o valor do modelo para o padrão que você deseja, desta forma:
Eu criei um fork do plnkr de @Douglas aqui para demonstrar as várias maneiras de obter o comportamento desejado no angular2.
fonte
<select [(ngModel)]="selectedTimeFrame"> <option *ngFor="let val of timeFrames" [ngValue]="val">val</option> </select>
Adicione este código na posição o da lista de seleção.
<option [ngValue]="undefined" selected>Select</option>
fonte
Você pode abordar desta forma:
ou assim:
ou você pode definir o valor padrão desta forma:
ou
fonte
Use o índice para mostrar o primeiro valor como padrão
fonte
De acordo com https://angular.io/api/forms/SelectControlValueAccessor, você só precisa do seguinte:
theView.html:
theComponent.ts
fonte
Lutei um pouco com este, mas acabei com a seguinte solução ... talvez ajude alguém.
Template HTML:
Componente:
fonte
Completando outras postagens, aqui está o que funciona no início rápido do Angular2,
Para definir o padrão DOM: juntamente com
*ngFor
, use uma instrução condicional no<option>
'sselected
atributo.Para definir o
Control
padrão de: use seu argumento de construtor. Caso contrário, antes de um onchange quando o usuário selecionar novamente uma opção, o que define o valor do controle com o atributo de valor da opção selecionada, o valor do controle será nulo.roteiro:
marcação:
fonte
Você pode usar isso em
[ngModel]
vez de[(ngModel)]
e está tudo bemfonte
Você pode fazer o seguinte:
No código acima, como você pode ver, o atributo selecionado da opção de repetição é definido na verificação do índice do loop de repetição da lista. [attr. <nome do atributo html>] é usado para definir o atributo html no angular2.
Outra abordagem será definir o valor do modelo no arquivo typescript como:
fonte
Acrescente à resposta de @Matthijs, certifique-se de que seu
select
elemento tenha umname
atributo ename
seja único em seu template html. Angular 2 está usando o nome de entrada para atualizar as alterações. Portanto, se houver nomes duplicados ou nenhum nome anexado ao elemento de entrada, a ligação falhará.fonte
Adicionar propriedade de ligação selecionada, mas certifique-se de torná-la nula, para outros campos, por exemplo:
Agora vai funcionar
fonte
Se você estiver usando o formulário, deve haver um
name
campo dentro daselect
tag.Tudo que você precisa fazer é apenas adicionar
value
àoption
tag.selectedWorkout
o valor deve ser "back" e pronto.fonte
Se você não quiser a ligação bidirecional via [(ngModel)], faça o seguinte:
Acabei de testar no meu projeto no Angular 4 e funciona! O accountsList é uma matriz de objetos Account em que name é uma propriedade de Account.
Observação interessante:
[ngValue] = "acct" exerce o mesmo resultado que [ngValue] = "acct.name".
Não sei como o Angular 4 consegue isso!
fonte
fonte
Para mim, defino algumas propriedades:
Então, no construtor e no ngOnInit
E no modelo eu adiciono isso como a primeira opção dentro do elemento select
Se você permitir a seleção da primeira opção, você pode simplesmente remover o uso da propriedade disabledFirstOption
fonte
No meu caso, aqui
this.selectedtestSubmitResultView
está definido com o valor padrão com base nas condições e uma variáveltestSubmitResultView
deve ser igual atestSubmitResultView
. Isso realmente funcionou para mimPara maiores informações,
fonte
Eu enfrentei esse problema antes e o corrigi com uma maneira simples de contornar o problema
Para seu Component.html
Então, em seu component.ts, você pode detectar a opção selecionada por
fonte
funciona muito bem como visto abaixo:
fonte
Você só precisa colocar o ngModel e o valor que deseja selecionar:
fonte