Làm cách nào để liên kết với danh sách các giá trị hộp kiểm với AngularJS?


670

Tôi có một vài hộp kiểm:

<input type='checkbox' value="apple" checked>
<input type='checkbox' value="orange">
<input type='checkbox' value="pear" checked>
<input type='checkbox' value="naartjie">

Rằng tôi muốn liên kết với một danh sách trong bộ điều khiển của mình để mỗi khi thay đổi hộp kiểm, bộ điều khiển sẽ duy trì một danh sách tất cả các giá trị được kiểm tra, ví dụ , ['apple', 'pear'].

ng-model dường như chỉ có thể liên kết giá trị của một hộp kiểm duy nhất với một biến trong bộ điều khiển.

Có cách nào khác để làm điều đó để tôi có thể liên kết bốn hộp kiểm vào một danh sách trong bộ điều khiển không?


23
Nó có phải là một danh sách? Một đối tượng có hoạt động không <input type='checkbox' ng-model="checkboxes.apple">?, V.v. Mô hình sẽ là: {"apple": true, "cam": false, "lê": true, "naartjie": true}
Mark Rajcok

2
Hãy thử chỉ thị trong Repo
Vikas Gautam

1
Hãy chắc chắn nhìn qua câu trả lời được chấp nhận. Có một câu trả lời khác , theo tôi, thanh lịch hơn nhiều.
Jason Swett

3
naartjie!? Điều đó chỉ mang lại cho bạn đi boet! : D
Piotr Kula

1
@ppumkin hehe vừa thấy cái này. Bạn nói đúng: D
nickponline

Câu trả lời:


927

Có hai cách để tiếp cận vấn đề này. Hoặc sử dụng một mảng đơn giản hoặc một mảng các đối tượng. Mỗi giải pháp đều có ưu và nhược điểm. Dưới đây bạn sẽ tìm thấy một cho mỗi trường hợp.


Với một mảng đơn giản là dữ liệu đầu vào

HTML có thể trông như sau:

<label ng-repeat="fruitName in fruits">
  <input
    type="checkbox"
    name="selectedFruits[]"
    value="{{fruitName}}"
    ng-checked="selection.indexOf(fruitName) > -1"
    ng-click="toggleSelection(fruitName)"
  > {{fruitName}}
</label>

Và mã điều khiển thích hợp sẽ là:

app.controller('SimpleArrayCtrl', ['$scope', function SimpleArrayCtrl($scope) {

  // Fruits
  $scope.fruits = ['apple', 'orange', 'pear', 'naartjie'];

  // Selected fruits
  $scope.selection = ['apple', 'pear'];

  // Toggle selection for a given fruit by name
  $scope.toggleSelection = function toggleSelection(fruitName) {
    var idx = $scope.selection.indexOf(fruitName);

    // Is currently selected
    if (idx > -1) {
      $scope.selection.splice(idx, 1);
    }

    // Is newly selected
    else {
      $scope.selection.push(fruitName);
    }
  };
}]);

Ưu điểm : Cấu trúc dữ liệu đơn giản và chuyển đổi theo tên rất dễ xử lý

Nhược điểm : Thêm / xóa là cồng kềnh vì hai danh sách (đầu vào và lựa chọn) phải được quản lý


Với một mảng đối tượng là dữ liệu đầu vào

HTML có thể trông như sau:

<label ng-repeat="fruit in fruits">
  <!--
    - Use `value="{{fruit.name}}"` to give the input a real value, in case the form gets submitted
      traditionally

    - Use `ng-checked="fruit.selected"` to have the checkbox checked based on some angular expression
      (no two-way-data-binding)

    - Use `ng-model="fruit.selected"` to utilize two-way-data-binding. Note that `.selected`
      is arbitrary. The property name could be anything and will be created on the object if not present.
  -->
  <input
    type="checkbox"
    name="selectedFruits[]"
    value="{{fruit.name}}"
    ng-model="fruit.selected"
  > {{fruit.name}}
</label>

Và mã điều khiển thích hợp sẽ là:

app.controller('ObjectArrayCtrl', ['$scope', 'filterFilter', function ObjectArrayCtrl($scope, filterFilter) {

  // Fruits
  $scope.fruits = [
    { name: 'apple',    selected: true },
    { name: 'orange',   selected: false },
    { name: 'pear',     selected: true },
    { name: 'naartjie', selected: false }
  ];

  // Selected fruits
  $scope.selection = [];

  // Helper method to get selected fruits
  $scope.selectedFruits = function selectedFruits() {
    return filterFilter($scope.fruits, { selected: true });
  };

  // Watch fruits for changes
  $scope.$watch('fruits|filter:{selected:true}', function (nv) {
    $scope.selection = nv.map(function (fruit) {
      return fruit.name;
    });
  }, true);
}]);

Ưu điểm : Thêm / xóa rất dễ dàng

Nhược điểm : Một số cấu trúc dữ liệu phức tạp hơn và chuyển đổi theo tên là cồng kềnh hoặc yêu cầu một phương thức trợ giúp


Bản trình diễn : http://jsbin.com/ImAqUC/1/


10
FYI, thay vì tiêm bộ lọc $, bạn có thể tiêm bộ lọcFilter, sau đó sử dụng như sau: return filterFilter ($ scope.fruits, {check: true}); Các bộ lọc tùy chỉnh và tích hợp được đăng ký với $ kim phun với tên filterNameFilter ("filterName" nên in nghiêng) - $ filterProvider docs
Mark Rajcok 25/1/13

24
value="{{fruit.name}}"ng-checked="fruit.checked"không cần thiết, vì mô hình ng được sử dụng.
Mark Rajcok

3
Tôi nhận thấy rằng không cần chỉ định "đã kiểm tra" trong mô hình, Angular sẽ tự động đặt thuộc tính :)
daveoncode

3
Nên sử dụng ng-thay vì ng-click vì nó xử lý các trường hợp cạnh tốt hơn.
amccausl

2
@ViktorMolokostov Điều đó sẽ hữu ích, nếu bạn gửi biểu mẫu theo truyền thống . Có nghĩa là đăng nó lên trình xử lý hành động (một số tập lệnh phía máy chủ). Với php, một phần tử biểu mẫu có tên như thế (sử dụng dấu ngoặc vuông) tạo ra một mảng trong dữ liệu yêu cầu. Bằng cách này bạn có thể dễ dàng xử lý các loại trái cây được lựa chọn.
Yoshi

406

Một giải pháp đơn giản:

<div ng-controller="MainCtrl">
  <label ng-repeat="(color,enabled) in colors">
      <input type="checkbox" ng-model="colors[color]" /> {{color}} 
  </label>
  <p>colors: {{colors}}</p>
</div>

<script>
  var app = angular.module('plunker', []);

  app.controller('MainCtrl', function($scope){
      $scope.colors = {Blue: true, Orange: true};
  });
</script>

http://plnkr.co/edit/U4VD61?p=preview


57
@kolypto - đây chắc chắn là câu trả lời. Tôi viết lại nó cho những người (như tôi) đang làm việc với các đối tượng: plnkr.co/edit/cqsADe8lKegsBMgWMyB8?p=preview
Kyle

5
Tôi làm điều đó giống như bạn làm, nhưng kích hoạt trong (color,enabled) in colorslàm gì?
Sebastian

3
@Sebastian, vì colorslà một đối tượng, khi bạn lặp lại nó - bạn nhận được các cặp (key,value).
kolypto

10
Mặc dù tôi rất thích câu trả lời này! Tôi nghĩ rằng, có một vấn đề lớn với việc sử dụng các đối tượng làm nguồn dữ liệu. Đó là bởi vì theo định nghĩa, thứ tự của các thuộc tính đối tượng là không xác định, người ta không thể cung cấp một thứ tự xác định khi hiển thị các hộp kiểm. Vẫn +1;)
Yoshi

2
colorsnên được đặt tên isSelected, nó dễ đọc isSelected[color]hơn nhiều so vớicolors[color]
Dmitri Zaitsev

86
<input type='checkbox' ng-repeat="fruit in fruits"
  ng-checked="checkedFruits.indexOf(fruit) != -1" ng-click="toggleCheck(fruit)">

.

function SomeCtrl ($scope) {
    $scope.fruits = ["apple, orange, pear, naartjie"];
    $scope.checkedFruits = [];
    $scope.toggleCheck = function (fruit) {
        if ($scope.checkedFruits.indexOf(fruit) === -1) {
            $scope.checkedFruits.push(fruit);
        } else {
            $scope.checkedFruits.splice($scope.checkedFruits.indexOf(fruit), 1);
        }
    };
}

2
Yêu cách đơn giản như thế này, chính xác những gì tôi đang tìm kiếm (mặc dù tôi phải thừa nhận rằng chỉ thị @vitalets là tuyệt vời). Tôi đã sửa đổi mã của Umur một chút để tạo fiddle này: jsfiddle.net/samurai_jane/9mwsbfuc
samurai_jane

Tôi làm cho lời của Samurai Jane của tôi! Thật đơn giản để hiển thị những gì tôi cần! :)
Francis Coleues

81

Đây là một chỉ thị nhỏ có thể tái sử dụng nhanh dường như làm những gì bạn đang muốn làm. Tôi chỉ đơn giản gọi nó checkList. Nó cập nhật mảng khi các hộp kiểm thay đổi và cập nhật các hộp kiểm khi mảng thay đổi.

app.directive('checkList', function() {
  return {
    scope: {
      list: '=checkList',
      value: '@'
    },
    link: function(scope, elem, attrs) {
      var handler = function(setup) {
        var checked = elem.prop('checked');
        var index = scope.list.indexOf(scope.value);

        if (checked && index == -1) {
          if (setup) elem.prop('checked', false);
          else scope.list.push(scope.value);
        } else if (!checked && index != -1) {
          if (setup) elem.prop('checked', true);
          else scope.list.splice(index, 1);
        }
      };

      var setupHandler = handler.bind(null, true);
      var changeHandler = handler.bind(null, false);

      elem.bind('change', function() {
        scope.$apply(changeHandler);
      });
      scope.$watch('list', setupHandler, true);
    }
  };
});

Đây là một bộ điều khiển và một khung nhìn cho thấy cách bạn có thể sử dụng nó.

<div ng-app="myApp" ng-controller='MainController'>
  <span ng-repeat="fruit in fruits">
    <input type='checkbox' value="{{fruit}}" check-list='checked_fruits'> {{fruit}}<br />
  </span>

  <div>The following fruits are checked: {{checked_fruits | json}}</div>

  <div>Add fruit to the array manually:
    <button ng-repeat="fruit in fruits" ng-click='addFruit(fruit)'>{{fruit}}</button>
  </div>
</div>
app.controller('MainController', function($scope) {
  $scope.fruits = ['apple', 'orange', 'pear', 'naartjie'];
  $scope.checked_fruits = ['apple', 'pear'];
  $scope.addFruit = function(fruit) {
    if ($scope.checked_fruits.indexOf(fruit) != -1) return;
    $scope.checked_fruits.push(fruit);
  };
});

(Các nút chứng minh rằng việc thay đổi mảng cũng sẽ cập nhật các hộp kiểm.)

Cuối cùng, đây là một ví dụ về chỉ thị hành động trên Plunker: http://plnkr.co/edit/3YNLsyoG4PIBW6Kj7dRK?p=preview


2
Cảm ơn Brandon, điều này đã làm chính xác những gì tôi muốn (và chính xác những gì câu hỏi yêu cầu quá, không giống như các câu trả lời khác). Điều chỉnh duy nhất tôi đã thực hiện là thay đổi "elem.on ('thay đổi', hàm () ..." thành "elem.bind ('thay đổi', hàm () ..." để loại bỏ sự phụ thuộc vào jQuery .
Jonathan Moffatt

Điều này khá gọn gàng, nhưng bằng cách nào đó đã phá hủy khả năng sử dụng ng-tật của tôi :( Có cách nào tôi có thể khắc phục điều đó không?
Nikolaj Dam Larsen

Siêu hữu ích! Và thậm chí làm việc cho tôi với các đối tượng thay vì mảng cho cả danh sách nguồn và danh sách dữ liệu!
SteveShaffer

Tôi đồng ý với mọi người. Đây là một trong những hữu ích nhất và chắc chắn có thể tái sử dụng !! Cảm ơn đã làm việc tốt. :)
maksbd19

2
Nếu bạn gặp sự cố với AngularJS> = 1.4.4, hãy kiểm tra github.com/angular/angular.js/issues/13037 : thay thế value: '@'bằngvalue: '=ngValue'
tanguy_k

66

Dựa trên các câu trả lời trong chủ đề này, tôi đã tạo ra chỉ thị mô hình danh sách kiểm tra bao gồm tất cả các trường hợp:

  • mảng đơn giản của người nguyên thủy
  • mảng các đối tượng (chọn id hoặc toàn bộ đối tượng)
  • tính chất đối tượng lặp

Đối với trường hợp bắt đầu chủ đề, nó sẽ là:

<label ng-repeat="fruit in ['apple', 'orange', 'pear', 'naartjie']">
    <input type="checkbox" checklist-model="selectedFruits" checklist-value="fruit"> {{fruit}}
</label>

Trông giống như những gì tôi cần. Có bất kỳ cơ hội nào bạn có thể giải thích cách sử dụng nó khi nhận dữ liệu không đồng bộ không? Đó là phần khó hiểu với tôi.
Dan Cancro

Sau khi bạn nhận được dữ liệu không đồng bộ, chỉ cần sửa đổi mô hình checlist trong phạm vi, trong ví dụ trên selectedFruits.
Adrian Ber

11

Sử dụng chuỗi $indexcó thể giúp sử dụng hàm băm của các giá trị được chọn:

<ul>
    <li ng-repeat="someItem in someArray">
        <input type="checkbox" ng-model="someObject[$index.toString()]" />
    </li>
</ul>

Bằng cách này, đối tượng ng-model được cập nhật với khóa đại diện cho chỉ mục.

$scope.someObject = {};

Sau một thời gian $scope.someObjectsẽ trông giống như:

$scope.someObject = {
     0: true,
     4: false,
     1: true
};

Phương pháp này sẽ không hoạt động cho tất cả các tình huống, nhưng nó rất dễ thực hiện.


Đây là một giải pháp rất thanh lịch và phù hợp với trường hợp của tôi (sử dụng AJAX)
Stephan Ryer

sử dụng phương pháp hôn
Geomorillo

8

Vì bạn đã chấp nhận một câu trả lời trong đó một danh sách không được sử dụng, tôi sẽ giả sử câu trả lời cho câu hỏi nhận xét của tôi là "Không, nó không phải là một danh sách". Tôi cũng có ấn tượng rằng có thể bạn đang điều khiển phía máy chủ HTML, vì "đã kiểm tra" có trong HTML mẫu của bạn (điều này sẽ không cần thiết nếu mô hình ng được sử dụng để mô hình các hộp kiểm của bạn).

Dù sao, đây là những gì tôi đã nghĩ khi đặt câu hỏi, đồng thời giả sử bạn đang tạo phía máy chủ HTML:

<div ng-controller="MyCtrl" 
 ng-init="checkboxes = {apple: true, orange: false, pear: true, naartjie: false}">
    <input type="checkbox" ng-model="checkboxes.apple">apple
    <input type="checkbox" ng-model="checkboxes.orange">orange
    <input type="checkbox" ng-model="checkboxes.pear">pear
    <input type="checkbox" ng-model="checkboxes.naartjie">naartjie
    <br>{{checkboxes}}
</div>

ng-init cho phép HTML được tạo phía máy chủ để đặt các hộp kiểm nhất định.

Fiddle .


8

Tôi nghĩ cách giải quyết đơn giản nhất là sử dụng 'select' với 'nhiều' được chỉ định:

<select ng-model="selectedfruit" multiple ng-options="v for v in fruit"></select>

Mặt khác, tôi nghĩ bạn sẽ phải xử lý danh sách để xây dựng danh sách (bằng cách $watch()lấy mảng mô hình liên kết với các hộp kiểm).


3
Anh ấy yêu cầu một danh sách hộp kiểm, nhưng bạn đang nói với anh ấy về lựa chọn với các tùy chọn. Mà là hoàn toàn khác nhau.
CrazySabbath

@CrazySabbath: nhưng bạn không hiểu rằng anh ấy đề xuất một giải pháp thay thế và câu trả lời này đã giúp 6 người khác như một "giải pháp thay thế"
tò mòBoy

5

Tôi đã điều chỉnh câu trả lời được chấp nhận của Yoshi để đối phó với các đối tượng phức tạp (thay vì chuỗi).

HTML

<div ng-controller="TestController">
    <p ng-repeat="permission in allPermissions">
        <input type="checkbox" ng-checked="selectedPermissions.containsObjectWithProperty('id', permission.id)" ng-click="toggleSelection(permission)" />
        {{permission.name}}
    </p>

    <hr />

    <p>allPermissions: | <span ng-repeat="permission in allPermissions">{{permission.name}} | </span></p>
    <p>selectedPermissions: | <span ng-repeat="permission in selectedPermissions">{{permission.name}} | </span></p>
</div>

JavaScript

Array.prototype.indexOfObjectWithProperty = function(propertyName, propertyValue)
{
    for (var i = 0, len = this.length; i < len; i++) {
        if (this[i][propertyName] === propertyValue) return i;
    }

    return -1;
};


Array.prototype.containsObjectWithProperty = function(propertyName, propertyValue)
{
    return this.indexOfObjectWithProperty(propertyName, propertyValue) != -1;
};


function TestController($scope)
{
    $scope.allPermissions = [
    { "id" : 1, "name" : "ROLE_USER" },
    { "id" : 2, "name" : "ROLE_ADMIN" },
    { "id" : 3, "name" : "ROLE_READ" },
    { "id" : 4, "name" : "ROLE_WRITE" } ];

    $scope.selectedPermissions = [
    { "id" : 1, "name" : "ROLE_USER" },
    { "id" : 3, "name" : "ROLE_READ" } ];

    $scope.toggleSelection = function toggleSelection(permission) {
        var index = $scope.selectedPermissions.indexOfObjectWithProperty('id', permission.id);

        if (index > -1) {
            $scope.selectedPermissions.splice(index, 1);
        } else {
            $scope.selectedPermissions.push(permission);
        }
    };
}

Ví dụ hoạt động: http://jsfiddle.net/tCU8v/


1
Bạn không bao giờ nên có <input type="checkbox">mà không có một gói hoặc kết hợp <label>! Bây giờ người dùng của bạn phải nhấp vào hộp kiểm thực tế thay vì văn bản bên cạnh hộp kiểm, khó hơn nhiều và khả năng sử dụng kém.
Scott

5

Một chỉ thị đơn giản khác có thể giống như:

var appModule = angular.module("appModule", []);

appModule.directive("checkList", [function () {
return {
    restrict: "A",
    scope: {
        selectedItemsArray: "=",
        value: "@"
    },
    link: function (scope, elem) {
        scope.$watchCollection("selectedItemsArray", function (newValue) {
            if (_.contains(newValue, scope.value)) {
                elem.prop("checked", true);
            } else {
                elem.prop("checked", false);
            }
        });
        if (_.contains(scope.selectedItemsArray, scope.value)) {
            elem.prop("checked", true);
        }
        elem.on("change", function () {
            if (elem.prop("checked")) {
                if (!_.contains(scope.selectedItemsArray, scope.value)) {
                    scope.$apply(
                        function () {
                            scope.selectedItemsArray.push(scope.value);
                        }
                    );
                }
            } else {
                if (_.contains(scope.selectedItemsArray, scope.value)) {
                    var index = scope.selectedItemsArray.indexOf(scope.value);
                    scope.$apply(
                        function () {
                            scope.selectedItemsArray.splice(index, 1);
                        });
                }
            }
            console.log(scope.selectedItemsArray);
        });
    }
};
}]);

Bộ điều khiển:

appModule.controller("sampleController", ["$scope",
  function ($scope) {
    //#region "Scope Members"
    $scope.sourceArray = [{ id: 1, text: "val1" }, { id: 2, text: "val2" }];
    $scope.selectedItems = ["1"];
    //#endregion
    $scope.selectAll = function () {
      $scope.selectedItems = ["1", "2"];
  };
    $scope.unCheckAll = function () {
      $scope.selectedItems = [];
    };
}]);

Và HTML:

<ul class="list-unstyled filter-list">
<li data-ng-repeat="item in sourceArray">
    <div class="checkbox">
        <label>
            <input type="checkbox" check-list selected-items-array="selectedItems" value="{{item.id}}">
            {{item.text}}
        </label>
    </div>
</li>

Tôi cũng bao gồm một Plunker: http://plnkr.co/edit/XnFtyij4ed6RyFwnFN6V?p=preview


5

Các giải pháp sau đây có vẻ như là một lựa chọn tốt,

<label ng-repeat="fruit in fruits">
  <input
    type="checkbox"
    ng-model="fruit.checked"
    ng-value="true"
  > {{fruit.fruitName}}
</label>

Và trong giá trị mô hình bộ điều khiển fruitssẽ như thế này

$scope.fruits = [
  {
    "name": "apple",
    "checked": true
  },
  {
    "name": "orange"
  },
  {
    "name": "grapes",
    "checked": true
  }
];

Tôi càng nhìn vào các ví dụ này, có vẻ như tôi sẽ phải ánh xạ mảng của mình thành một mảng các đối tượng.
Winnemucca

4

Bạn không cần phải viết tất cả mã đó. AngularJS sẽ giữ cho mô hình và các hộp kiểm được đồng bộ hóa đơn giản bằng cách sử dụng ngTrueValue và ngFalseValue

Codepen tại đây: http://codepen.io/paulbhartzog/pen/kBhzn

Đoạn mã:

<p ng-repeat="item in list1" class="item" id="{{item.id}}">
  <strong>{{item.id}}</strong> <input name='obj1_data' type="checkbox" ng-model="list1[$index].data" ng-true-value="1" ng-false-value="0"> Click this to change data value below
</p>
<pre>{{list1 | json}}</pre>

Đây không phải là những gì OP yêu cầu.
bfontaine

Các hộp kiểm ràng buộc vào một danh sách là những gì đã được hỏi và những gì tôi đã làm. Các mảng có thể được sửa đổi cho phù hợp với ứng dụng. Điểm quan trọng là các hộp kiểm bị ràng buộc. ngTrueValue và ngFalseValue cũng có thể được sử dụng để ánh xạ tới một mảng thứ hai chỉ liệt kê các thuộc tính khác, chẳng hạn như tên.
Paul B. Hartzog

OP muốn một danh sách các giá trị được kiểm tra, không phải là danh sách tất cả các giá trị, được kiểm tra và bỏ chọn.
bfontaine


4

Có một cách để làm việc trực tiếp trên mảng và sử dụng mô hình ng cùng một lúc thông qua ng-model-options="{ getterSetter: true }" .

Mẹo nhỏ là sử dụng hàm getter / setter trong mô hình ng của bạn. Bằng cách này, bạn có thể sử dụng một mảng làm mô hình thực của mình và "giả" các booleans trong mô hình của đầu vào:

<label ng-repeat="fruitName in ['apple', 'orange', 'pear', 'naartjie']">
  <input
    type="checkbox"
    ng-model="fruitsGetterSetterGenerator(fruitName)"
    ng-model-options="{ getterSetter: true }"
  > {{fruitName}}
</label>

$scope.fruits = ['apple', 'pear']; // pre checked

$scope.fruitsGetterSetterGenerator = function(fruitName){
    return function myGetterSetter(nowHasFruit){
        if (nowHasFruit !== undefined){

            // Setter
            fruitIndex = $scope.fruits.indexOf(fruit);
            didHaveFruit = (fruitIndex !== -1);
            mustAdd = (!didHaveFruit && nowHasFruit);
            mustDel = (didHaveFruit && !nowHasFruit);
            if (mustAdd){
                $scope.fruits.push(fruit);
            }
            if (mustDel){
                $scope.fruits.splice(fruitIndex, 1);
            }
        }
        else {
            // Getter
            return $scope.user.fruits.indexOf(fruit) !== -1;
        }
    }
}

CAVEAT Bạn không nên sử dụng phương pháp này nếu mảng của bạn lớn nhưmyGetterSetter sẽ được gọi rất nhiều lần.

Để biết thêm về điều đó, hãy xem https://docs.angularjs.org/api/ng/directive/ngModelOptions .


3

Tôi thích câu trả lời của Yoshi. Tôi đã tăng cường nó để bạn có thể sử dụng cùng một chức năng cho nhiều danh sách.

<label ng-repeat="fruitName in fruits">
<input
type="checkbox"
name="selectedFruits[]"
value="{{fruitName}}"
ng-checked="selection.indexOf(fruitName) > -1"
ng-click="toggleSelection(fruitName, selection)"> {{fruitName}}
</label>


<label ng-repeat="veggieName in veggies">
<input
type="checkbox"
name="selectedVeggies[]"
value="{{veggieName}}"
ng-checked="veggieSelection.indexOf(veggieName) > -1"
ng-click="toggleSelection(veggieName, veggieSelection)"> {{veggieName}}
</label>



app.controller('SimpleArrayCtrl', ['$scope', function SimpleArrayCtrl($scope) {
  // fruits
  $scope.fruits = ['apple', 'orange', 'pear', 'naartjie'];
  $scope.veggies = ['lettuce', 'cabbage', 'tomato']
  // selected fruits
  $scope.selection = ['apple', 'pear'];
  $scope.veggieSelection = ['lettuce']
  // toggle selection for a given fruit by name
  $scope.toggleSelection = function toggleSelection(selectionName, listSelection) {
    var idx = listSelection.indexOf(selectionName);

    // is currently selected
    if (idx > -1) {
      listSelection.splice(idx, 1);
    }

    // is newly selected
    else {
      listSelection.push(selectionName);
    }
  };
}]);

http://plnkr.co/edit/KcbtzEyNMA8s1X7Hja8p?p=preview


3

Nếu bạn có nhiều hộp kiểm trên cùng một mẫu

Mã điều khiển

vm.doYouHaveCheckBox = ['aaa', 'ccc', 'bbb'];
vm.desiredRoutesCheckBox = ['ddd', 'ccc', 'Default'];
vm.doYouHaveCBSelection = [];
vm.desiredRoutesCBSelection = [];

Xem mã

<div ng-repeat="doYouHaveOption in vm.doYouHaveCheckBox">
    <div class="action-checkbox">
        <input id="{{doYouHaveOption}}" type="checkbox" value="{{doYouHaveOption}}" ng-checked="vm.doYouHaveCBSelection.indexOf(doYouHaveOption) > -1" ng-click="vm.toggleSelection(doYouHaveOption,vm.doYouHaveCBSelection)" />
        <label for="{{doYouHaveOption}}"></label>
        {{doYouHaveOption}}
    </div>
</div>

<div ng-repeat="desiredRoutesOption in vm.desiredRoutesCheckBox">
     <div class="action-checkbox">
          <input id="{{desiredRoutesOption}}" type="checkbox" value="{{desiredRoutesOption}}" ng-checked="vm.desiredRoutesCBSelection.indexOf(desiredRoutesOption) > -1" ng-click="vm.toggleSelection(desiredRoutesOption,vm.desiredRoutesCBSelection)" />
          <label for="{{desiredRoutesOption}}"></label>
          {{desiredRoutesOption}}
     </div>
</div>        

3

Lấy cảm hứng từ bài viết của Yoshi ở trên. Đây là plnkr .

(function () {
   
   angular
      .module("APP", [])
      .controller("demoCtrl", ["$scope", function ($scope) {
         var dc = this
         
         dc.list = [
            "Selection1",
            "Selection2",
            "Selection3"
         ]

         dc.multipleSelections = []
         dc.individualSelections = []
         
         // Using splice and push methods to make use of 
         // the same "selections" object passed by reference to the 
         // addOrRemove function as using "selections = []" 
         // creates a new object within the scope of the 
         // function which doesn't help in two way binding.
         dc.addOrRemove = function (selectedItems, item, isMultiple) {
            var itemIndex = selectedItems.indexOf(item)
            var isPresent = (itemIndex > -1)
            if (isMultiple) {
               if (isPresent) {
                  selectedItems.splice(itemIndex, 1)
               } else {
                  selectedItems.push(item)
               }
            } else {
               if (isPresent) {
                  selectedItems.splice(0, 1)
               } else {
                  selectedItems.splice(0, 1, item)
               }
            }
         }
         
      }])
   
})()
label {
  display: block;  
}
<!DOCTYPE html>
<html>

   <head>
      <link rel="stylesheet" href="style.css" />
   </head>

   <body ng-app="APP" ng-controller="demoCtrl as dc">
      <h1>checkbox-select demo</h1>
      
      <h4>Multiple Selections</h4>
      <label ng-repeat="thing in dc.list">
         <input 
            type="checkbox" 
            ng-checked="dc.multipleSelections.indexOf(thing) > -1"
            ng-click="dc.addOrRemove(dc.multipleSelections, thing, true)"
         > {{thing}}
      </label>
      
      <p>
         dc.multipleSelections :- {{dc.multipleSelections}}
      </p>
      
      <hr>
      
      <h4>Individual Selections</h4>
      <label ng-repeat="thing in dc.list">
         <input 
            type="checkbox" 
            ng-checked="dc.individualSelections.indexOf(thing) > -1"
            ng-click="dc.addOrRemove(dc.individualSelections, thing, false)"
         > {{thing}}
      </label>
      
      <p>
         dc.invidualSelections :- {{dc.individualSelections}}
      </p>
      
      <script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
      <script data-require="angular.js@1.5.6" data-semver="1.5.6" src="https://code.angularjs.org/1.5.6/angular.min.js"></script>
      <script src="script.js"></script>
   </body>

</html>


3

Dựa trên bài viết khác của tôi ở đây , tôi đã thực hiện một chỉ thị có thể sử dụng lại.

Kiểm tra kho GitHub

(function () {
   
   angular
      .module("checkbox-select", [])
      .directive("checkboxModel", ["$compile", function ($compile) {
         return {
            restrict: "A",
            link: function (scope, ele, attrs) {
               // Defining updateSelection function on the parent scope
               if (!scope.$parent.updateSelections) {
                  // Using splice and push methods to make use of 
                  // the same "selections" object passed by reference to the 
                  // addOrRemove function as using "selections = []" 
                  // creates a new object within the scope of the 
                  // function which doesn't help in two way binding.
                  scope.$parent.updateSelections = function (selectedItems, item, isMultiple) {
                     var itemIndex = selectedItems.indexOf(item)
                     var isPresent = (itemIndex > -1)
                     if (isMultiple) {
                        if (isPresent) {
                           selectedItems.splice(itemIndex, 1)
                        } else {
                           selectedItems.push(item)
                        }
                     } else {
                        if (isPresent) {
                           selectedItems.splice(0, 1)
                        } else {
                           selectedItems.splice(0, 1, item)
                        }
                     }
                  }   
               }
               
               // Adding or removing attributes
               ele.attr("ng-checked", attrs.checkboxModel + ".indexOf(" + attrs.checkboxValue + ") > -1")
               var multiple = attrs.multiple ? "true" : "false"
               ele.attr("ng-click", "updateSelections(" + [attrs.checkboxModel, attrs.checkboxValue, multiple].join(",") + ")")
               
               // Removing the checkbox-model attribute, 
               // it will avoid recompiling the element infinitly
               ele.removeAttr("checkbox-model")
               ele.removeAttr("checkbox-value")
               ele.removeAttr("multiple")
               
               $compile(ele)(scope)
            }
         }
      }])
   
      // Defining app and controller
      angular
      .module("APP", ["checkbox-select"])
      .controller("demoCtrl", ["$scope", function ($scope) {
         var dc = this
         dc.list = [
            "selection1",
            "selection2",
            "selection3"
         ]
         
         // Define the selections containers here
         dc.multipleSelections = []
         dc.individualSelections = []
      }])
   
})()
label {
  display: block;  
}
<!DOCTYPE html>
<html>

   <head>
      <link rel="stylesheet" href="style.css" />
      
   </head>
   
   <body ng-app="APP" ng-controller="demoCtrl as dc">
      <h1>checkbox-select demo</h1>
      
      <h4>Multiple Selections</h4>
      <label ng-repeat="thing in dc.list">
         <input type="checkbox" checkbox-model="dc.multipleSelections" checkbox-value="thing" multiple>
         {{thing}}
      </label>
      <p>dc.multipleSelecitons:- {{dc.multipleSelections}}</p>
      
      <h4>Individual Selections</h4>
      <label ng-repeat="thing in dc.list">
         <input type="checkbox" checkbox-model="dc.individualSelections" checkbox-value="thing">
         {{thing}}
      </label>
      <p>dc.individualSelecitons:- {{dc.individualSelections}}</p>
      
      <script data-require="jquery@3.0.0" data-semver="3.0.0" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.0.0/jquery.js"></script>
      <script data-require="angular.js@1.5.6" data-semver="1.5.6" src="https://code.angularjs.org/1.5.6/angular.min.js"></script>
      <script src="script.js"></script>
   </body>

</html>


3

Trong HTML (giả sử rằng các hộp kiểm nằm trong cột đầu tiên của mỗi hàng trong một bảng).

<tr ng-repeat="item in fruits">
    <td><input type="checkbox" ng-model="item.checked" ng-click="getChecked(item)"></td>
    <td ng-bind="fruit.name"></td>
    <td ng-bind="fruit.color"></td>
    ...
</tr>

Trong controllers.jstập tin:

// The data initialization part...
$scope.fruits = [
    {
      name: ....,
      color:....
    },
    {
      name: ....,
      color:....
    }
     ...
    ];

// The checked or not data is stored in the object array elements themselves
$scope.fruits.forEach(function(item){
    item.checked = false;
});

// The array to store checked fruit items
$scope.checkedItems = [];

// Every click on any checkbox will trigger the filter to find checked items
$scope.getChecked = function(item){
    $scope.checkedItems = $filter("filter")($scope.fruits,{checked:true});
};

3

Đây là một giải pháp khác. Mặt trái của giải pháp của tôi:

  • Nó không cần thêm đồng hồ (có thể có ảnh hưởng đến hiệu suất)
  • Nó không yêu cầu bất kỳ mã nào trong bộ điều khiển giữ cho nó sạch sẽ
  • Mã vẫn còn hơi ngắn
  • Nó đòi hỏi rất ít mã để sử dụng lại ở nhiều nơi vì nó chỉ là một lệnh

Đây là chỉ thị:

function ensureArray(o) {
    var lAngular = angular;
    if (lAngular.isArray(o) || o === null || lAngular.isUndefined(o)) {
        return o;
    }
    return [o];
}

function checkboxArraySetDirective() {
    return {
        restrict: 'A',
        require: 'ngModel',
        link: function(scope, element, attrs, ngModel) {
            var name = attrs.checkboxArraySet;

            ngModel.$formatters.push(function(value) {
                return (ensureArray(value) || []).indexOf(name) >= 0;
            });

            ngModel.$parsers.push(function(value) {
                var modelValue = ensureArray(ngModel.$modelValue) || [],
                    oldPos = modelValue.indexOf(name),
                    wasSet = oldPos >= 0;
                if (value) {
                    if (!wasSet) {
                        modelValue = angular.copy(modelValue);
                        modelValue.push(name);
                    }
                } else if (wasSet) {
                    modelValue = angular.copy(modelValue);
                    modelValue.splice(oldPos, 1);
                }
                return modelValue;
            });
        }
    }
}

Cuối cùng, chỉ cần sử dụng nó như thế này:

<input ng-repeat="fruit in ['apple', 'banana', '...']" type="checkbox" ng-model="fruits" checkbox-array-set="{{fruit}}" />

Và đó là tất cả có. Sự bổ sung duy nhất là checkbox-array-setthuộc tính.


3

Bạn có thể kết hợp AngularJS và jQuery. Ví dụ, bạn cần xác định một mảng $scope.selected = [];, trong bộ điều khiển.

<label ng-repeat="item in items">
    <input type="checkbox" ng-model="selected[$index]" ng-true-value="'{{item}}'">{{item}}
</label>

Bạn có thể có được một mảng sở hữu các mục đã chọn. Sử dụng phương pháp alert(JSON.stringify($scope.selected)), bạn có thể kiểm tra các mục đã chọn.


Hoàn hảo! ... đây là giải pháp đơn giản nhất sử dụng một mảng không phải là một đối tượng
Mario Campa

3
Đừng kết hợp Jquery và Angular
Jens Alenius

Điều này sẽ dẫn đến các lỗ hổng trong Mảng được chọn. Kiểm tra bài đăng
Vikas Gautam

2
  <div ng-app='app' >
    <div ng-controller='MainCtrl' >
       <ul> 
       <li ng-repeat="tab in data">
         <input type='checkbox' ng-click='change($index,confirm)' ng-model='confirm' />
         {{tab.name}} 
         </li>
     </ul>
    {{val}}
   </div>
 </div>


var app = angular.module('app', []);
 app.controller('MainCtrl',function($scope){
 $scope.val=[];
  $scope.confirm=false;
  $scope.data=[
   {
     name:'vijay'
     },
    {
      name:'krishna'
    },{
      name:'Nikhil'
     }
    ];
    $scope.temp;
   $scope.change=function(index,confirm){
     console.log(confirm);
    if(!confirm){
     ($scope.val).push($scope.data[index]);   
    }
    else{
    $scope.temp=$scope.data[index];
        var d=($scope.val).indexOf($scope.temp);
        if(d!=undefined){
         ($scope.val).splice(d,1);
        }    
       }
     }   
   })

1

Hãy xem cái này: mô hình danh sách kiểm tra .

Nó hoạt động với các mảng JavaScript và các đối tượng và nó có thể sử dụng các hộp kiểm HTML tĩnh mà không cần lặp lại

<label><input type="checkbox" checklist-model="roles" value="admin"> Administrator</label>
<label><input type="checkbox" checklist-model="roles" value="customer"> Customer</label>
<label><input type="checkbox" checklist-model="roles" value="guest"> Guest</label>
<label><input type="checkbox" checklist-model="roles" value="user"> User</label>

Và phía JavaScript:

var app = angular.module("app", ["checklist-model"]);
app.controller('Ctrl4a', function($scope) {
    $scope.roles = [];
});

1

Một cách đơn giản để làm điều đó HTML:

<input type="checkbox"
       ng-checked="fruits.indexOf('apple') > -1"
       ng-click="fruits.indexOf('apple') > -1 ? fruits.splice(fruits.indexOf('apple'), 1) : fruits.push('apple')">
<input type="checkbox"
       ng-checked="fruits.indexOf('orange') > -1"
       ng-click="fruits.indexOf('orange') > -1 ? fruits.splice(fruits.indexOf('orange'), 1) : fruits.push('orange')">
<input type="checkbox"
       ng-checked="fruits.indexOf('pear') > -1"
       ng-click="fruits.indexOf('pear') > -1 ? fruits.splice(fruits.indexOf('pear'), 1) : fruits.push('pear')">
<input type="checkbox"
       ng-checked="fruits.indexOf('naartjie') > -1"
       ng-click="fruits.indexOf('apple') > -1 ? fruits.splice(fruits.indexOf('apple'), 1) : fruits.push('naartjie')">


1

Sử dụng ví dụ này của @Umur Kontacı, tôi nghĩ rằng việc sử dụng để bắt dữ liệu được chọn trong một đối tượng / mảng khác, như trang chỉnh sửa.

Bắt các tùy chọn tại cơ sở dữ liệu

nhập mô tả hình ảnh ở đây

Chuyển đổi một số tùy chọn

nhập mô tả hình ảnh ở đây

Ví dụ, tất cả các màu json ở bên dưới:

{
    "colors": [
        {
            "id": 1,
            "title": "Preto - #000000"
        },
        {
            "id": 2,
            "title": "Azul - #005AB1"
        },
        {
            "id": 3,
            "title": "Azul Marinho - #001A66"
        },
        {
            "id": 4,
            "title": "Amarelo - #FFF100"
        },
        {
            "id": 5,
            "title": "Vermelho - #E92717"
        },
        {
            "id": 6,
            "title": "Verde - #008D2F"
        },
        {
            "id": 7,
            "title": "Cinza - #8A8A8A"
        },
        {
            "id": 8,
            "title": "Prata - #C8C9CF"
        },
        {
            "id": 9,
            "title": "Rosa - #EF586B"
        },
        {
            "id": 10,
            "title": "Nude - #E4CAA6"
        },
        {
            "id": 11,
            "title": "Laranja - #F68700"
        },
        {
            "id": 12,
            "title": "Branco - #FFFFFF"
        },
        {
            "id": 13,
            "title": "Marrom - #764715"
        },
        {
            "id": 14,
            "title": "Dourado - #D9A300"
        },
        {
            "id": 15,
            "title": "Bordo - #57001B"
        },
        {
            "id": 16,
            "title": "Roxo - #3A0858"
        },
        {
            "id": 18,
            "title": "Estampado "
        },
        {
            "id": 17,
            "title": "Bege - #E5CC9D"
        }
    ]
}

Và 2 loại đối tượng dữ liệu, arrayvới một đối tượng và objectchứa hai / nhiều dữ liệu đối tượng:

  • Hai mục được chọn bắt tại cơ sở dữ liệu:

    [{"id":12,"title":"Branco - #FFFFFF"},{"id":16,"title":"Roxo - #3A0858"}]
  • Một mục được chọn bắt tại cơ sở dữ liệu:

    {"id":12,"title":"Branco - #FFFFFF"}

Và đây, mã javascript của tôi:

/**
 * Add this code after catch data of database.
 */

vm.checkedColors = [];
var _colorObj = vm.formData.color_ids;
var _color_ids = [];

if (angular.isObject(_colorObj)) {
    // vm.checkedColors.push(_colorObj);
    _color_ids.push(_colorObj);
} else if (angular.isArray(_colorObj)) {
    angular.forEach(_colorObj, function (value, key) {
        // vm.checkedColors.push(key + ':' + value);
        _color_ids.push(key + ':' + value);
    });
}

angular.forEach(vm.productColors, function (object) {
    angular.forEach(_color_ids, function (color) {
        if (color.id === object.id) {
            vm.checkedColors.push(object);
        }
    });
});

/**
 * Add this code in your js function initialized in this HTML page
 */
vm.toggleColor = function (color) {
    console.log('toggleColor is: ', color);

    if (vm.checkedColors.indexOf(color) === -1) {
        vm.checkedColors.push(color);
    } else {
        vm.checkedColors.splice(vm.checkedColors.indexOf(color), 1);
    }
    vm.formData.color_ids = vm.checkedColors;
};

Mã Html của tôi:

<div class="checkbox" ng-repeat="color in productColors">
    <label>
        <input type="checkbox"
               ng-checked="checkedColors.indexOf(color) != -1"
               ng-click="toggleColor(color)"/>
        <% color.title %>
    </label>
</div>

<p>checkedColors Output:</p>
<pre><% checkedColors %></pre>

[Chỉnh sửa] Mã tái cấu trúc bên dưới:

function makeCheckedOptions(objectOptions, optionObj) {
    var checkedOptions = [];
    var savedOptions = [];

    if (angular.isObject(optionObj)) {
        savedOptions.push(optionObj);
    } else if (angular.isArray(optionObj)) {
        angular.forEach(optionObj, function (value, key) {
            savedOptions.push(key + ':' + value);
        });
    }

    angular.forEach(objectOptions, function (object) {
        angular.forEach(savedOptions, function (color) {
            if (color.id === object.id) {
                checkedOptions.push(object);
            }
        });
    });

    return checkedOptions;
}

Và gọi phương thức mới như sau:

vm.checkedColors = makeCheckedOptions(productColors, vm.formData.color_ids);

Đó là nó!


1

Tôi đã đặt một mảng trong bộ điều khiển.

$scope.statuses = [{ name: 'Shutdown - Reassessment Required' },
    { name: 'Under Construction' },
    { name: 'Administrative Cancellation' },
    { name: 'Initial' },
    { name: 'Shutdown - Temporary' },
    { name: 'Decommissioned' },
    { name: 'Active' },
    { name: 'SO Shutdown' }]

Trên đánh dấu tôi đã đặt một cái gì đó như sau

<div ng-repeat="status in $scope.statuses">
   <input type="checkbox" name="unit_status" ng-model="$scope.checkboxes[status.name]"> {{status.name}}
   <br>                        
</div>
{{$scope.checkboxes}}

Đầu ra là như sau, trong bộ điều khiển tôi chỉ cần kiểm tra xem nó đúng hay sai; đúng cho kiểm tra, vắng mặt / sai cho không được kiểm tra.

{
"Administrative Cancellation":true,
"Under Construction":true,
"Shutdown - Reassessment Required":true,
"Decommissioned":true,
"Active":true
}

Hi vọng điêu nay co ich.


0

Tôi nghĩ rằng cách sau đây rõ ràng và hữu ích hơn cho các lần lặp ng lồng nhau. Kiểm tra nó trên Plunker .

Trích dẫn từ chủ đề này :

<html ng-app="plunker">
    <head>
        <title>Test</title>
        <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.4/angular.min.js"></script>
    </head>

    <body ng-controller="MainCtrl">
        <div ng-repeat="tab in mytabs">

            <h1>{{tab.name}}</h1>
            <div ng-repeat="val in tab.values">
                <input type="checkbox" ng-change="checkValues()" ng-model="val.checked"/>
            </div>
        </div>

        <br>
        <pre> {{selected}} </pre>

            <script>
                var app = angular.module('plunker', []);

                app.controller('MainCtrl', function ($scope,$filter) {
                    $scope.mytabs = [
             {
                 name: "tab1",
                 values: [
                     { value: "value1",checked:false },
                     { value: "value2", checked: false },
                     { value: "value3", checked: false },
                     { value: "value4", checked: false }
                 ]
             },
             {
                 name: "tab2",
                 values: [
                     { value: "value1", checked: false },
                     { value: "value2", checked: false },
                     { value: "value3", checked: false },
                     { value: "value4", checked: false }
                 ]
             }
                    ]
                    $scope.selected = []
                    $scope.checkValues = function () {
                        angular.forEach($scope.mytabs, function (value, index) {
                         var selectedItems = $filter('filter')(value.values, { checked: true });
                         angular.forEach(selectedItems, function (value, index) {
                             $scope.selected.push(value);
                         });

                        });
                    console.log($scope.selected);
                    };
                });
        </script>
    </body>
</html>

0

Đây là liên kết jsFillde cho cùng, http://jsfiddle.net/techno2mahi/Lfw96ja6/ .

Điều này sử dụng chỉ thị có sẵn để tải xuống tại http://vitalets.github.io/checklist-model/ .

Đây là điều tốt để có chỉ thị vì ứng dụng của bạn sẽ cần chức năng này thường xuyên.

Mã dưới đây:

HTML:

<div class="container">
    <div class="ng-scope" ng-app="app" ng-controller="Ctrl1">
        <div class="col-xs-12 col-sm-6">
            <h3>Multi Checkbox List Demo</h3>
            <div class="well">  <!-- ngRepeat: role in roles -->
                <label ng-repeat="role in roles">
                    <input type="checkbox" checklist-model="user.roles" checklist-value="role"> {{role}}
                </label>
            </div>

            <br>
            <button ng-click="checkAll()">check all</button>
            <button ng-click="uncheckAll()">uncheck all</button>
            <button ng-click="checkFirst()">check first</button>
            <div>
                <h3>Selected User Roles </h3>
                <pre class="ng-binding">{{user.roles|json}}</pre>
            </div>

            <br>
            <div><b/>Provided by techno2Mahi</b></div>
        </div>

JavaScript

var app = angular.module("app", ["checklist-model"]);
app.controller('Ctrl1', function($scope) {
  $scope.roles = [
    'guest',
    'user',
    'customer',
    'admin'
  ];
  $scope.user = {
    roles: ['user']
  };
  $scope.checkAll = function() {
    $scope.user.roles = angular.copy($scope.roles);
  };
  $scope.uncheckAll = function() {
    $scope.user.roles = [];
  };
  $scope.checkFirst = function() {
    $scope.user.roles.splice(0, $scope.user.roles.length);
    $scope.user.roles.push('guest');
  };
});

HTML không được định dạng tốt - có nhiều thẻ mở <div>hơn đóng </div>. Bạn đã để lại một cái gì đó?
Peter Mortensen

0

Hãy thử con tôi:

**

myApp.filter('inputSelected', function(){
  return function(formData){
    var keyArr = [];
    var word = [];
    Object.keys(formData).forEach(function(key){
    if (formData[key]){
        var keyCap = key.charAt(0).toUpperCase() + key.slice(1);
      for (var char = 0; char<keyCap.length; char++ ) {
        if (keyCap[char] == keyCap[char].toUpperCase()){
          var spacedLetter = ' '+ keyCap[char];
          word.push(spacedLetter);
        }
        else {
          word.push(keyCap[char]);
        }
      }
    }
    keyArr.push(word.join(''))
    word = [];
    })
    return keyArr.toString();
  }
})

**

Sau đó, đối với bất kỳ mô hình ng nào có hộp kiểm, nó sẽ trả về một chuỗi tất cả các đầu vào bạn đã chọn:

<label for="Heard about ITN">How did you hear about ITN?: *</label><br>
<label class="checkbox-inline"><input ng-model="formData.heardAboutItn.brotherOrSister" type="checkbox" >Brother or Sister</label>
<label class="checkbox-inline"><input ng-model="formData.heardAboutItn.friendOrAcquaintance" type="checkbox" >Friend or Acquaintance</label>


{{formData.heardAboutItn | inputSelected }}

//returns Brother or Sister, Friend or Acquaintance
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.