简体   繁体   English

角度根据值禁用ng-repeat复选框

[英]Angular to disable ng-repeat checkbox based on value

I have a list of checkbox displayed using ng-repeat, now i need to disable some checkbox based on specific value checkbox is checked. 我有一个使用ng-repeat显示的复选框列表,现在我需要根据特定值禁用某些复选框。

checkbox display code

<div class="checkbox">
     <label ng-repeat="specific in specifications">
          <input ng-click="onClick(specific, newObject[specific])" id="specifications_chk" value="{{specific}}" ng-model="newObject[specific]" type="checkbox">
          {{specific}}
     </label>
</div>

Here am using ng-click function to disable checkbox. 这是使用ng-click功能禁用复选框。

This is my controller code:

$scope.onClick = function(sp, checked){
        if(sp == 'Sofa_Cleaning' && checked === true){
            angular.element(document.getElementById('specifications_chk'))[0].disabled = true;
        }

        if(sp == 'Sofa_Cleaning' && checked === false){
            angular.element(document.getElementById('specifications_chk'))[0].disabled = false;
        }

    };

html view:

in controller code am able disable only first value (IndepthHomeCleaning) , so how can i disable Room_Cleaning, Kitchen_Cleaning, and Carpet_cleaning when Sofa_Cleaning is checked 在控制器代码是能够禁用仅第一值(IndepthHomeCleaning)所以如何禁用Room_Cleaning, Kitchen_Cleaning,Carpet_cleaningSofa_Cleaningchecked 复选框视图

Am i stuck with this, Help will be really appreciated 我是否坚持使用此功能,将不胜感激帮助

I don't know why you are still stick with the jquery. 我不知道你为什么仍然坚持使用jQuery。 You are getting by id when you are trying to disable the checkbox. 当您尝试禁用复选框时,您将通过id获取。

.

In html, id should be unique for the current html page. 在html中,id对于当前html页面应该是唯一的。 y ou are having duplicated ids and you are getting the first value from the array using [o] when you are trying to disable. 您有重复的ID,并且尝试禁用时,使用[o]从数组中获取第一个值。

.

If you strictly want solution from the same method then use the following methodology Use class name instead of id for the check boxes and use angular element and disable. 如果您严格希望使用同一方法解决方案,请使用以下方法将复选框使用类名代替id并使用angular元素并禁用。

The following code should be used where you need to disable. 需要禁用的位置应使用以下代码。 Use appropriate code based on your need. 根据您的需要使用适当的代码。

    angular.forEach(document.getElementsByClassName('checkbox1'), function(value, key) {
        angular.element(value)[0].disabled = true;
        debugger
  });

use ng-disabled 使用ng-disabled

 var angApp = angular.module('myApp', []); angApp.controller('MyController', function MyController($scope) { $scope.specifications = [{"text":"IndepthHomeCleaning ", "disabled":false, "checked":false}, {"text":"Room_Cleaning", "disabled":false, "checked":false}, {"text":"Kitchen_Cleaning", "disabled":false, "checked":false}, {"text":"BathroomCleaning", "disabled":false, "checked":false}, {"text":"Carpet_cleaning", "disabled":false, "checked":false}, {"text":"Sofa_Cleaning", "disabled":false, "checked":false}]; $scope.onClick = function(sp, checked){ console.log(sp, checked); if(sp.text == 'Sofa_Cleaning' && checked){ $scope.specifications[1].disabled = true; $scope.specifications[2].disabled = true; $scope.specifications[4].disabled = true; } if(sp.text == 'Sofa_Cleaning' && !checked){ $scope.specifications[1].disabled = false; $scope.specifications[2].disabled = false; $scope.specifications[4].disabled = false; } }; }); 
 <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> <div ng-app="myApp" ng-controller="MyController"> <div class="checkbox"> <label ng-repeat="specific in specifications" style="display:block"> <input ng-disabled="specific.disabled" ng-change="onClick(specific, specific.checked)" id="specifications_chk" value="specific.checked}" ng-model="specific.checked" type="checkbox"> {{specific.text}} </label> </div> </div> 

I think you're over complicating this. 我认为您已经使这一问题复杂化了。 Your data object should be simplified to look like this 您的数据对象应简化为如下所示

$scope.specifications = [
    {name: 'Sofa_Cleaning', active: false},
    {name: 'Carpet_Cleaning', active: false},
    {name: 'Room_Cleaning', active: false},
    {name: 'Kitchen_Cleaning', active: false},
    {name: 'BathroomCleaning', active: false}
];

Template: 模板:

<input type="checkbox"
    ng-bind="specific.name" 
    ng-model="specific.active"
    ng-disabled="shouldDisable(specific)">

in your controller 在您的控制器中

$scope.disableWhenSofaIsChecked = ['Room_Cleaning','Kitchen_Cleaning','Carpet_Cleaning'];
$scope.shouldDisable = function(specific) {
    var disable = $scope.disableWhenSofaIsChecked;
    if(disable.indexOf(specific.name) > -1) {
        for(var obj in $scope.specifications) {
            if(obj.name === 'Sofa_Cleaning') {
                return obj.active;
            }
        }
    }
    return false;
}

EDIT 编辑

So if you're getting specifications data from API, you can just do this: 因此,如果您要从API获取规范数据,则可以执行以下操作:

SomeApi
    .get()
    .then(function(results){
        // Assuming it's a promise. End result is the same for a passed-in callback
        // Assuming results is an array of names 
        $scope.specifications = results.map(function(item){
            return {
                name: item,
                active: false
            };
        });
    });

You should not have same id for multiple elements in your code. 您的代码中的多个元素不应具有相同的ID。 You need to make you elements ids unique. 您需要使元素ID唯一。

HTML : HTML:

<div ng-app ng-controller="LoginController">
  <div class="checkbox">
    <label ng-repeat="specific in specifications">
      <input id="specifications_chk{{$index}}" ng-click="onClick(specific, newObject[specific])" value="{{specific}}" ng-model="newObject[specific]" type="checkbox" /> {{specific}}
      <br>
    </label>
  </div>
</div>

JavaScript : JavaScript:

function LoginController($scope) {
  $scope.specifications = ['IndepthHomeCleaning',
    'Room_Cleaning',
    'Kitchen_Cleaning',
    'BathroomCleaning',
    'Carpet_cleaning',
    'Sofa_Cleaning'
  ];
  $scope.newObject = {
    'IndepthHomeCleaning': 1,
    'Room_Cleaning': 2,
    'Kitchen_Cleaning': 3,
    'BathroomCleaning': 4,
    'Carpet_cleaning': 5,
    'Sofa_Cleaning': 6
  };
  $scope.onClick = function(sp, checked) {
    if (sp == 'Sofa_Cleaning' && checked === true) {
      angular.element(document.getElementById('specifications_chk1'))[0].disabled = true;
      angular.element(document.getElementById('specifications_chk2'))[0].disabled = true;
      angular.element(document.getElementById('specifications_chk4'))[0].disabled = true;
    }

    if (sp == 'Sofa_Cleaning' && checked === false) {
      angular.element(document.getElementById('specifications_chk1'))[0].disabled = false;
      angular.element(document.getElementById('specifications_chk2'))[0].disabled = false;
      angular.element(document.getElementById('specifications_chk3'))[0].disabled = false;
    }


  };
}

JsFiddle : https://jsfiddle.net/nikdtu/f7k3kcwn/ JsFiddle: https ://jsfiddle.net/nikdtu/f7k3kcwn/

You are using 'id' attribute which should be unique for each DOM element. 您正在使用“ id”属性,该属性对于每个DOM元素都应该是唯一的。 So definitely your solution will take single element. 因此,您的解决方案肯定会只包含一个元素。 So you should try using class attribute and document.getElementbyClass function. 因此,您应该尝试使用类属性和document.getElementbyClass函数。

If you want to change specifications array you need a new array and mapping. 如果要更改specifications数组,则需要新的数组和映射。 Define new row object for each specification. 为每个规范定义新的行对象。 Access specification row and its prop (is active or is disable) from your specification. 从您的规范访问规范行及其属性(处于活动状态或已禁用)。

http://jsfiddle.net/ms403Ly8/87/ http://jsfiddle.net/ms403Ly8/87/

function testCtrl($scope, $filter) {
$scope.specifications = ["IndepthHomeCleaning", "Room_Cleaning", "Kitchen_Cleaning", "Carpet_cleaning", "Sofa_Cleaning"];
$scope.specificationRows = [];

$scope.newRow = function(spec) {
    var newSpec = {
        SpecName: spec,
        IsDisabled: false,
        IsClicked: false
    };
    $scope.specificationRows.push(newSpec);
};

$scope.getRowObject = function(sp) {
    return $filter('filter')($scope.specificationRows, {
        SpecName: sp
    })[0];
};

$scope.getRowStatus = function(spec) {
    console.log($filter('filter')($scope.specificationRows, {
        SpecName: spec
    })[0].IsDisabled);
    return $scope.getRowObject(spec).IsDisabled;
};

$scope.onClick = function(sp) {
    $scope.getRowObject(sp).IsClicked = !$scope.getRowObject(sp).IsClicked;
    if (sp == 'Sofa_Cleaning') {
        $scope.getRowObject("Carpet_cleaning").IsDisabled = $scope.getRowObject(sp).IsClicked;
        $scope.getRowObject("Kitchen_Cleaning").IsDisabled = $scope.getRowObject(sp).IsClicked;
        $scope.getRowObject("Room_Cleaning").IsDisabled = $scope.getRowObject(sp).IsClicked;
    }
};

} }

getRowObject is example. getRowObject是示例。 Maybe it's not best practice. 也许这不是最佳实践。 You can change this function. 您可以更改此功能。

Don't use jquery to for dom manipulation. 不要使用jquery进行dom操作。

Use ng-change instead of ng-click. 使用ng-change而不是ng-click。 This will be the appropriate one. 这将是适当的。

Here I've update a plunkr. 在这里,我更新了一个punkr。

Here for the simple example, I've done like if the value is check5 then disable all the checkboxes. 在这里作为简单示例,我已经完成了类似值5的操作,然后禁用了所有复选框。 Otherwise enable the checkboxes. 否则,启用复选框。

https://jsfiddle.net/AvGKj/517/ https://jsfiddle.net/AvGKj/517/

Note : I've used little bit old plugin. 注意 :我使用了一点旧插件。 Please take the logics alone 请单独考虑逻辑

<div ng-controller="MyCtrl">
    <table>
    <tr ng-repeat="appObj in myAppObjects">
        <td>
        <input type="checkbox" ng-model="appObj.cb1"
        ng-disabled="appObj.disable"
        ng-change="Disable(appObj,myAppObjects)">
        {{appObj.value}}
            </td>
    </tr>
    </table>
    {{myAppObjects}}
    <br>list of checked items: {{checkedItems()}}
</div>

function MyCtrl($scope) {

        $scope.myAppObjects = [
       {id:1,value:'check1'},
       {id:2,value:'check2'},
       {id:3,value:'check3'},
       {id:4,value:'check4'},
       {id:5,value:'check5'}
       ];

      $scope.Disable=function(appObj,list)
      {
        if(appObj.value=="check5")
        {
             for(var i=0; i<list.length;i++)
           {
           if(list[i].value!="check5")
              {
                if(appObj.cb1==true)
                {
                list[i].disable=true;
                }
                else{
                list[i].disable=false;
                }
              }
           }
        }
      }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM