2012-11-18 7 views
14

Ich bin Radio-Schaltflächen dynamisch erstellen. ng-change='newValue(value) wird nicht mehr aufgerufen, nachdem jeder Radiobutton einmal gedrückt wurde.Angular: radiobuttons beenden feuern "ng-change", nachdem jeder geklickt wurde

Das funktioniert: Durch Klicken auf die Optionsschaltflächen wird der Wert in foo/bar/baz geändert. http://jsfiddle.net/ZPcSe/19/

<div ng-controller="MyCtrl"> 
<input type="radio" ng-model="value" value="foo" ng-change='newValue(value)'> 
<input type="radio" ng-model="value" value="bar" ng-change='newValue(value)'> 
<input type="radio" ng-model="value" value="baz" ng-change='newValue(value)'>  
<hr> 
{{value}} 
</div> 

dieser Code nicht: Der {{value}} - "label" wird nicht aktualisiert, sobald jedes Optionsfeld wurde mindestens einmal gedrückt. Aparently ng-change wird nicht mehr ausgelöst.

<div ng-controller="MyCtrl"> 
    <span ng-repeat="i in [0, 1, 2]"> 
    <input name="asdf" type="radio" ng-model="value" value={{i}} ng-change='newValue(value)'> 
    </span> 
    {{value}} 
</div> 

http://jsfiddle.net/ZPcSe/18/

Die controlles ist das gleiche jedes Mal: ​​

var myApp = angular.module('myApp', []); 

function MyCtrl($scope) { 
    $scope.value = '-'; 
    $scope.newValue = function(value) { 
    $scope.value = value; 
    } 
} 

Vielen Dank für Ihre Hilfe.

Antwort

21

ngRepeatcreates new scope, so versucht value setzt es auf den neuen Bereich. Die Abhilfe ist eine Eigenschaft auf ein Objekt zu verweisen, die auf dem übergeordneten Bereich ist - geschieht das Objekt Suche auf dem übergeordneten Bereich, und dann die Eigenschaft zu ändern wie erwartet funktioniert:

HTML:

<div ng-controller="MyCtrl"> 
<span ng-repeat="i in [0, 1, 2]"> 
    <input name="asdf" ng-model="options.value" value="{{i}}" type="radio"> 
</span> 
{{options.value}} 

JS :

var myApp = angular.module('myApp', []); 

function MyCtrl($scope) { 
    $scope.options = { 
     value: '-' 
    }; 
    $scope.newValue = function(value) { 
     // $scope.options.value = value; // not needed, unless you want to do more work on a change 
    } 
}​ 

Sie a working fiddle dieser Problemumgehung überprüfen können. Weitere Informationen finden Sie unter angular/angular.js#1100 on GitHub.

+1

Das scheint wie Magie - wie und wo heißt '$ scope.newValue'? Es gibt kein ng-change-Ereignis im HTML-Code, also wo wird es ausgelöst? – Richard

+0

@Richard Es feuert nicht; es war eine Funktion in der ursprünglichen Frage, also kopierte ich es über; Ich denke, die 'console.log' wurde von einigen Debugging auf JSFiddle verlassen. –

3

Nur eine schnelle Behelfslösung können wir die gleichgeschlechtliche erreichen ng-model="$parent.value" verwenden, weil es die Eltern von ng-repeat Umfang IE- in myCtrl Umfang

nur ändern, in ng-model beziehen würde -

<input name="asdf" type="radio" ng-model="$parent.value" value={{i}} ng-change='newValue(value)'> 

Here is the fiddle

0

Versuchen ng-click instea d von ng-change.

Verwandte Themen