加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

AngularJS多选模型数据绑定

发布时间:2020-12-17 17:12:56 所属栏目:安全 来源:网络整理
导读:我正在使用AngularJS v1.2.0-rc.3. 我有一个模型y与模型x的1对多关系. 最初,我有一个模型y的表单,有一个xs的多重选择,如下所示: 控制器: function test($scope) { $scope.xs = [ {id:1,value:'value 1'},{id:2,value:'value 2'},{id:3,value:'value 3'} ];
我正在使用AngularJS v1.2.0-rc.3.

我有一个模型y与模型x的1对多关系.

最初,我有一个模型y的表单,有一个xs的多重选择,如下所示:

控制器:

function test($scope) {
  $scope.xs = [
    {id:1,value:'value 1'},{id:2,value:'value 2'},{id:3,value:'value 3'}
  ];
  $scope.y = {xs:[2]};
}

视图:

<div ng-controller="test">
  <select multiple ng-model="y.xs" ng-options="x.id as x.value for x in xs">
  </select>    
</div>

结果是所选项目的数组.

http://plnkr.co/edit/s3tvvHeyE17TVH5KNkPZ

一切都很好,但我需要将其更改为复选框列表,发现我不能再使用数组了.

我尝试使用转发器的索引,如下所示:

<div ng-repeat="x in xs">
  <input type="checkbox" ng-model="y.xs[$index]" ng-true-value="{{x.id}}"/>
  {{x.value}}
</div>

但要预先选择第二项,我需要使用它:

$scope.y = {xs: [null,'2']};

这没用.

http://plnkr.co/edit/9UfbKF2gFLnhTOKu3Yep

经过一些搜索后,似乎推荐的方法是使用对象哈希,就像这样

<div ng-repeat="x in xs">
  <input type="checkbox" ng-model="y.xs[x.id]"/>
  {{x.value}}
</div>

http://plnkr.co/edit/Xek8alEJbwq3g0NAPMcF

但如果取消选择项目,您最终会看到如下内容:

y={
  "xs": {
    "1": false,"2": false,"3": false
  }
}

所以我最后添加了一个监视表达式来过滤掉错误的值,如下所示:

$scope.$watch('y.xs',function(n) {
  for (var k in n) 
    if (n.hasOwnProperty(k) && !n[k]) 
      delete n[k];
},true);

http://plnkr.co/edit/S1C1g5fYKzUZb7b0pRtp

它有效,但感觉不尽如人意.

由于这是一个常见的用例,我很想知道其他人是如何解决它的.

更新

根据建议使用自定义指令,我想出了这个解决方案,它将选择保持为列表.

指示:

angular.module('checkbox',[])
.directive('checkboxList',function () {
  return {
    restrict: 'A',replace: true,scope: {
      selection: '=',items: '=',value: '@',label: '@'
    },template: '<div ng-repeat="item in list">' +
      '<label>' +
      '<input type="checkbox" value="{{item.value}}" ng-checked="item.checked" ng-click="toggle($index)"/>' +
      '{{item.label}}' +
      '</label>' +
      '</div>',controller: ['$scope',function ($scope) {
      $scope.toggle = function (index) {
        var item = $scope.list[index],i = $scope.selection.indexOf(item.value);
        item.checked = !item.checked;
        if (!item.checked && i > -1) {
          $scope.selection.splice(i,1);
        } else if (item.checked && i < 0) {
          $scope.selection.push(item.value);
        }
      };
      $scope.$watch('items',function (value) {
        $scope.list = [];
        if (angular.isArray(value)) {
          angular.forEach(value,function (item) {
            $scope.list.push({
              value: item[$scope.value],label: item[$scope.label],checked: $scope.selection.indexOf(item[$scope.value]) > -1
            });
          });
        }
      },true);
    }]
  };
});

视图:

<div checkbox-list
     selection="a.bs"
     items="bs"
     value="id"
     label="name">
</div>

http://plnkr.co/edit/m7yH9bMPuRCg5OP2u0VX

解决方法

我过去自己不得不写一个多选指令,随便在 http://isteven.github.io/angular-multi-select抓住它.

至于数据绑定方法,我的数据结构实际上与你的数据结构非常相似,但在我的方法中,我添加了一个表示复选框状态的属性.

例如,在您输入上面的内容中,我添加了“已选中”:

$scope.xs = [
    { id:1,value:'value 1',checked: false },{ id:2,value:'value 2',{ id:3,value:'value 3',checked: false }
];

我把它传递给这样的指令:

<div 
    multi-select 
    input-model="xs" 
    button-label="value" 
    item-label="id value" 
    tick-property="checked" >
</div>

勾选/取消勾选复选框时,该指令将相应地修改输入模型$scope.xs.checked.为此,我为每个复选框附加了一个单击处理程序.这个处理程序将调用一个函数,我在其中传递checkbox对象作为函数参数.然后,此函数将同步复选框状态和模型.

要获得选中/勾选的复选框,您只需将$scope.xs循环到.checked === true

例:

angular.forEach( $scope.xs,function( value,key ) {
    if ( value.checked === true ) {
         // Do your stuff here
    }
});

原谅我的英语不好,希望这有帮助.干杯.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读