ラジオボタンのリストで選択した値をng-model
にバインドしようとしています
私が持っています:
<!DOCTYPE html>
<html ng-app="testApp">
<head>
<script src="./bower_components/angular/angular.min.js"></script>
<script src="test.js"></script>
</head>
<body ng-controller="testController">
<form>
<div ng-repeat="option in occurrenceOptions">
<input type="radio" name="occurrence" ng-value="option" ng-model="selectedOccurrence" /><label>{{ option }}</label>
</div>
</form>
<div>The selected value is : {{ selectedOccurrence }}</div>
<!-- This works -->
<input type="radio" ng-model="selected2" ng-value="'1'"> 1
<input type="radio" ng-model="selected2" ng-value="'2'"> 2
<input type="radio" ng-model="selected2" ng-value="'3'"> 3
<div>This selected value is : {{ selected2 }} </div>
</body>
</html>
私のコントローラーの場合:
(function () {
var app = angular.module('testApp', []);
app.controller('testController', function($scope) {
$scope.occurrenceOptions = [];
$scope.occurrenceOptions.Push('previous');
$scope.occurrenceOptions.Push('current');
$scope.occurrenceOptions.Push('next');
$scope.selected2;
});
}());
最初のセクションでは、すべてのoccurrenceOptions
をng-repeatして、すべてを同じモデルにバインドしようとしました。ただし、何かを選択するたびにselectedOccurrence
値は変更されません。
Plunkrを参照してください: https://plnkr.co/edit/k1pMgkLdrMUG1blktQx1?p=preview
ng-repeat
なしで、すべてのラジオボタンを入力するだけで、これを機能させることができます。 ng-repeat
バージョンが機能しないのはなぜですか?
動作しない理由は、ng-repeat
を使用しており、ng-model
変数を定義しているためです。 ng-repeat
が機能する方法は、コレクションの各反復で新しい子スコープ(プロトタイプで継承)を作成します。したがって、ng-model
テンプレートにあるng-repeat
は、新しく作成されたスコープに属します。ここで、ng-model="selectedOccurrence"
ng-repeat
の各反復でselectedOccurrence
スコープ変数を作成します。
このような問題を克服するには、AngularJSでモデルを定義するときにdot rule
に従う必要があります
マークアップ
<body ng-controller="testController">
<form>
<div ng-repeat="option in occurrenceOptions track by $index">
<input type="radio" name="occurrences" ng-value="option" ng-model="model.selectedOccurrence" />
<label>{{ option }}</label>
</div>
</form>
<div>The selected value is : {{ model.selectedOccurrence }}</div>
</body>
コード
$scope.model = {}; //defined a model object
$scope.model.selectedOccurrence = 'current'; //and defined property in it
または、別の好ましい方法は、コントローラーを宣言するときにcontrollerAs
パターンを使用することです(コントローラー内で$scope
の代わりにthis
を使用します)。
[〜#〜] html [〜#〜]
<body ng-controller="testController as vm">
<form>
<div ng-repeat="option in vm.occurrenceOptions">
<input type="radio" name="occurrence" ng-value="option" ng-model="vm.selectedOccurrence" /><label>{{ option }}</label>
</div>
</form>
</body>