2015-05-06 8 views
12

Sono di fronte ad un problema con AngularJS - Non sono in grado di visualizzare il valore selezionato in un <select>.AngularJS - Imposta il valore predefinito su select all'interno di una ng-repeat

Qui è il mio caso d'uso:

Ho una visione che parte da un ng-repeat per visualizzare i componenti. Ogni componente contiene una selezione per scegliere la velocità della vasca. Quando si creano nuovi oggetti, sembra buono. Ma quando sto modificando gli articoli esistenti, il codice vatRate effettivo non viene visualizzato nella selezione, e invece vedo l'opzione predefinita "- Seleziona tariffa IVA -" invece dell'IVA selezionata.

Il mio modello contiene solo l'Id della tariffa della vasca.

Con un singolo componente, posso utilizzare una variabile in $ scope per impostare il valore corrente dell'articolo, ma qui posso avere più componenti, ognuno di essi ha una propria percentuale di IVA, quindi non sono sicuro di come farlo qui :

Ecco il mio codice

<div ng-repeat="c in components" ng-form="vatForm"> 
    <select name="selectedVatRate" 
      ng-model="vatRate" 
      ng-init="vatRate = v.id" 
      ng-change="updateVatRate(c, selectedVatRate)" 
      ng-options="v.id for v in vatRates track by v.id"> 
    <option value="">-- Select VAT Rate --</option> 
    </select> 
</div> 

E gli oggetti:

$scope.vatRates = [ 
    { 'id': 1, 'value' : '20' }, 
    { 'id': 2, 'value' : '10' }, 
    { 'id': 3, 'value' : '7' } 
]; 

$scope.components = [ 
    { 'id': 1, 'title' : 'Title1', 'vatRateId' : '1' }, 
    { 'id': 2, 'title' : 'Title2', 'vatRateId' : '2' }, 
    { 'id': 3, 'title' : 'Title3', 'vatRateId' : '3' } 
]; 

Demo

+0

Certo, potremmo cercare di aiutare voi. Ma puoi aiutarci prima? Aiutaci rimuovendo le parti irrilevanti del markup e dello styling? Quindi, per evitare ipotesi e ipotesi, darci un'idea della struttura di alcuni degli oggetti che usi e di alcune funzioni, come 'updateVatRate' o' settings'? Per bonus extra, magari traduci alcune variabili/testo in inglese (vedi come questo è un sito in inglese). Ho corretto alcune cose per te - per favore aggiungi ulteriori dettagli sul codice mancante e la prossima volta, ti preghiamo di investire tempo nella tua domanda. –

+0

Grazie a @NewDev, pensavo di essere abbastanza chiaro per ^^ non importa qui è una demo dal vivo per spiegare il mio problema. http://plnkr.co/edit/OROLI64Q13PlJhSE4GOl?p=preview Non riesco a impostare su ogni elemento nella selezione il giusto valore – Pat

+0

è bene che tu abbia una demo, ma la domanda dovrebbe essere indipendente - I aggiornato, correggi la modifica se ritieni che non rifletta il tuo problema reale. –

risposta

25

Io non sono molto chiare circa il vostro requisito, ma se si desidera visualizzare un valore selezionato di default per <select>, è possibile utilizzare ng-selezionato. Per poter utilizzare che è necessario avere predefinito valore selezionato nel controller come un modelloal vostro <select> e aggiungere ng-selezionato al <options ng-selected="{{defaultvalue == value.id}}" ng-repeat="value in vatRates">

Per il codice e riferimento ho appena alterazione plunker,

http://embed.plnkr.co/ZXo8n0jE8r3LsgdhR0QP/preview

Spero che questo aiuti.

+0

Sì, questo è esattamente ciò di cui avevo bisogno !!! Molte grazie !! ;) – Pat

+0

Felice che il tuo problema sia stato risolto !! :) –

+1

Nel caso in cui si imposta l'impostazione predefinita su un valore di stringa noto, come "Matt", non si può semplicemente usare 'ng-selected =" 'Matt' "' '. La tua stringa conosciuta deve essere identificata al valore, ad esempio 'ng-selected =" {{value == 'Matt'}} "' – Matthew

1
<select ng-model="val" ng-init="myval = vals[0]"> 
      <option ng-repeat="myval in vals" value="{{myval.value}}">{{val.name}}</option> 
</select> 
8

È necessario impostare il valore predefinito su ng-model tramite controller anziché ng-init. Dal docs

L'unico uso appropriato di ngInit è per aliasing proprietà speciali di ngRepeat, come si è visto nella demo di seguito. Oltre a questo caso, è necessario utilizzare i controller anziché ngInit per inizializzare i valori su un ambito.

angular.module('app', []) 
 
.controller('SelectController', function() { 
 

 
    var selectCtrl = this; 
 
    selectCtrl.values = ["Value 1", "Value 2", "Value 3"]; 
 
    selectCtrl.selectedValue = "Value 1"; 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="app" ng-controller="SelectController as selectCtrl"> 
 
<select ng-model="selectCtrl.selectedValue"> 
 
    <option ng-repeat="value in selectCtrl.values" value="{{value}}">{{value}}  </option> 
 
    </select> 
 
</div>

+0

ma non è possibile cambiare l'opzione – ParPar

1

Questo è l'unico modo in cui sono riuscito a farlo, e viene eseguito quando cambia un'altra selezione. (Forse questo è la causa di altre soluzioni non funzionano, si prega di notare l'extra "" + per forzarlo ad essere una stringa (altrimenti non funziona)

Nel controllore:.

$ scope.formData .number_of_persons = "" + $ scope.numberOfPersons [0] .val;

HTML:

  <select name="number_of_persons" id="number_of_persons" ng-model="formData.number_of_persons" required> 
       <option ng-repeat="option in numberOfPersons" value="{{option.val}}">{{option.val}}</option> 
      </select> 
Problemi correlati