How do I bind to list of checkbox values with AngularJS?

前端 未结 29 2309
天涯浪人
天涯浪人 2020-11-22 05:20

I have a few checkboxes:





        
相关标签:
29条回答
  • 2020-11-22 06:00

    Based on answers in this thread I've created checklist-model directive that covers all cases:

    • simple array of primitives
    • array of objects (pick id or whole object)
    • object properties iteration

    For topic-starter case it would be:

    <label ng-repeat="fruit in ['apple', 'orange', 'pear', 'naartjie']">
        <input type="checkbox" checklist-model="selectedFruits" checklist-value="fruit"> {{fruit}}
    </label>
    
    0 讨论(0)
  • 2020-11-22 06:02

    The following solution seems like a good option,

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

    And in controller model value fruits will be like this

    $scope.fruits = [
      {
        "name": "apple",
        "checked": true
      },
      {
        "name": "orange"
      },
      {
        "name": "grapes",
        "checked": true
      }
    ];
    
    0 讨论(0)
  • 2020-11-22 06:03

    You can combine AngularJS and jQuery. For example, you need to define an array, $scope.selected = [];, in the controller.

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

    You can get an array owning the selected items. Using method alert(JSON.stringify($scope.selected)), you can check the selected items.

    0 讨论(0)
  • 2020-11-22 06:03

    Try my baby:

    **

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

    **

    Then for any ng-model with checkboxes, it will return a string of all the input you selected:

    <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
    
    0 讨论(0)
  • 2020-11-22 06:04

    I have adapted Yoshi's accepted answer to deal with complex objects (instead of strings).

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

    Working example: http://jsfiddle.net/tCU8v/

    0 讨论(0)
  • 2020-11-22 06:04

    I've put an array in the controller.

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

    On the markup I've put something like following

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

    The output was the following, in the controller I just needed to check whether its true or false; true for checked, absent/false for unchecked.

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

    Hope this helps.

    0 讨论(0)
提交回复
热议问题