2013-07-16 9 views
45

Sto generando un gruppo di pulsanti di opzione utilizzando ng-repeat, e quindi cercando di aggiornare un modello quando uno di essi è selezionato. Questo non sembra funzionare.AngularJS - Modello non aggiornato alla selezione del pulsante di opzione generato da ng-repeat

Lo stesso codice funziona correttamente quando gli ingressi radio sono codificati in modo rigido anziché essere generati da ng-repeat.

Questo funziona:

<input type="radio" ng-model="lunch" value="chicken" name="lunch"> 
<input type="radio" ng-model="lunch" value="beef" name="lunch"> 
<input type="radio" ng-model="lunch" value="fish" name="lunch"> 
{{lunch}} 

Questo non lo fa:

<input type="radio" ng-model="lunch" ng-repeat="m in meat" value="m" name="lunch">  
{{lunch}} 

Vedi jsfiddle mostra sia qui: http://jsfiddle.net/mark_up/A2qCS/1/

Qualsiasi aiuto sarebbe apprezzato.

Grazie

risposta

93
<div ng-controller="DynamicCtrl"> 
    <input type="radio" ng-model="$parent.lunch" ng-repeat="m in meat" 
    ng-value="m" name="lunch">  
    {{lunch}} 
</div> 

dovrebbe fare il trucco.

Come ho capito, ng-repeat crea il proprio $scope. quindi è necessario fare riferimento allo $parent $scope; Sì, AngularJS è complicato. Inoltre è necessario modificare lo value su ng-value.

+33

alternativa all'utilizzo '$ parent' è quello di utilizzare una proprietà oggetto nel controller:' $ scope.selection = {pranzo: 'pollo'}; ', quindi nel codice HTML: ' {{selection.lunch}} ' –

+1

Grazie @MarkRajcok! Stava mettendo '$ scope.selection = {lunch: 'chicken'};' nel controller che mi ha aiutato. E ho scoperto di rimuovere anche il mio 'ng-checked =" true "' dal pulsante radio html, perché quell'impostazione nel controller selezionerà automaticamente il pulsante di opzione corretto/programmatico. –

+0

@MarkRajcok, qual è la logica alla base dell'utilizzo della proprietà dell'oggetto per evitare l'utilizzo di $ parent? –

4

il problema di cui sopra è stata discussa here

Questo accade perché ng-repeat crea un nuovo ambito. Fondamentalmente, ogni <input> sta creando un valore Option selezionato sul proprio ambito interno. Per ovviare a ciò, crea un nuovo oggetto contenitore per quel valore. Ad esempio, è possibile dichiarare nel controller:

$scope.data = {selectedOption: x}; 

E poi nel modello, utilizzare ng-model="data.selectedOption"

in questo modo, ng-modello ottiene aggiornati .. :)

questo è difficile

0

basta sostituire il valore con ng valore

Problemi correlati