5

Im cố gắng để ràng buộc giá trị được chọn trong danh sách các nút radio để một ng-modelAngularJs: Ràng buộc ng mô hình vào một danh sách các nút radio

tôi có:

<!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> 

Đối với bộ điều khiển của tôi:

(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; 
    }); 
}()); 

Trong phần đầu tiên, tôi đã cố gắng ng lặp lại tất cả các occurrenceOptions và liên kết tất cả với cùng một mô hình. Tuy nhiên, mỗi lần tôi chọn một cái gì đó giá trị selectedOccurrence không thay đổi.

Xem plunkr: https://plnkr.co/edit/k1pMgkLdrMUG1blktQx1?p=preview

mà không ng-repeat và chỉ cần gõ ra tất cả các nút radio, tôi có thể có được điều này để làm việc. Tại sao phiên bản ng-repeat không hoạt động?

Trả lời

13

Lý do đằng sau nó không hoạt động, bạn đang sử dụng ng-repeat & bạn đang xác định ng-model biến trong đó. Cách thức hoạt động của ng-repeat là tạo ra một phạm vi con mới (được thừa kế nguyên mẫu) trên mỗi lần lặp lại của bộ sưu tập. Vì vậy, ng-model nằm trong mẫu ng-repeat, thuộc phạm vi mới được tạo đó. Tại đây, hãy ng-model="selectedOccurrence" tạo biến số phạm vi selectedOccurrence trên mỗi lần lặp của ng-repeat.

Để khắc phục một vấn đề như vậy, bạn cần phải làm theo dot rule trong khi xác định mô hình trong AngularJS

Markup

<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 

Demo Plunkr


HOẶC Một cách ưu tiên khác sẽ sử dụng mẫu controllerAs trong khi khai báo bộ điều khiển (sử dụng this thay vì $scope bên trong bộ điều khiển).

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> 

ControllerAs Demo

Các vấn đề liên quan