angular-formly multiCheckbox全选

时间:2016-03-14 21:38:06

标签: javascript angularjs angular-formly

我有一个角度形式的多选字段,有以下选项:

vm.fields = [
    {
    key: 'fruits',
    type: 'multiCheckbox',
    className: 'multi-check',
    templateOptions: {
        label: 'Fruits:',
        options: [
            {
                "name": "ALL",
                "value":"ALL"
            },

            {
                "name": "apple",
                "value":"apple"
            },
            {
                "name": "orange",
                "value":"orange"
            },
            {
                "name": "pear",
                "value":"pear"
            },
            {
                "name": "blueberry",
                "value":"blueberry"
            },
        ],
    },

  },

];

当我选择/取消选择" ALL"时,我想要选择/取消选择所有选项。 例如。如果选中ALL,则还应检查所有水果选项(苹果,橙子,梨,蓝莓)

如果我取消选择ALL,则不应检查任何水果选项。

如何以角度形式启用此行为?

以下是jsbin的链接: https://jsbin.com/xololi/edit?html,js,output

3 个答案:

答案 0 :(得分:2)

我在这里写了一个工作示例https://jsbin.com/dukewac/6/edit?js,output

当函数为$modelValue, fieldOptions, scope, event时,templateOptions.onClick的签名。运行ngModelAttrsTemplateManipulator时会发生这种情况。我在我的函数中利用了这些变量。

其中一些有点hacky但部分与角度实现复选框的方式有关,以及在angular-formly-templates-bootstrap中使用的multiCheckbox类型的变通方法。

陷阱

嵌套密钥

此示例不适用于嵌套键,但应该更新multiCheckbox类型。这是因为它使用数组访问符号直接访问模型[请参阅此处的代码](https://github.com/formly-js/angular-formly-templates-bootstrap/blob/a69d69e5c3f6382ea6a6c028c1d8bf76a9b94db3/src/types/multiCheckbox.js)。

硬编码“全部”选项

代码还假设'ALL'选项是列表中的第一个选项,其值为'ALL'。这可以通过添加templateOption属性来修复,该属性引用所有功能的索引和值。

模型包含'ALL'

'ALL'将出现在您的模型中。解决这个问题的一种可能方法是为它定义一个$解析器。

不支持templateOptions.valueProp

templateOptions.valueProp没有被考虑在内,但不应该太难添加。

答案 1 :(得分:0)

您是否有任何解决方案如何将defaultValue添加到multiCheckbox。我可以添加它并在模型中看到它但在视图(html)上它不会显示。 我在jsbin上做了一些例子,我有各种类型的字段和multiCheckbox ... jsbin example 感谢。

答案 2 :(得分:0)

这是另一个有效的解决方案(实际更新了ckniffty的代码),它将 ng-click 绑定到多个复选框字段,然后在控制器中调用函数:

        ....
        ngModelElAttrs: {
          "ng-click": "update(this.option.value)"
        },
        controller: function ($scope) {
          $scope.update = function (val) {
            var all = 'ALL',
              // field key
              key = $scope.options.key,
              // if true - current checkbox is selected, otherwise - unselected
              selected = $scope.model[key].indexOf(val) !== -1,
              // index of 'ALL' checkbox within model array
              indexOfAll = $scope.model[key].indexOf(all);

            // 'ALL' checkbox clicked
            if (val === all) {
              // on select - select all checkboxes, on unselect - unselect all checkboxes
              $scope.options.value(selected ? $scope.to.options.map(function (option) {
                return option.value;
              }) : []);
            }
            // other then 'ALL' checkbox unselected, while 'ALL' is selected
            else if (!selected && indexOfAll !== -1) {
              // unselect 'ALL' checkbox
              $scope.model[key].splice(indexOfAll, 1);
            }
            // all checkboxes selected except of 'ALL'
      else if (selected && indexOfAll === -1 && $scope.model[key].length === $scope.to.options.length - 1) {
        // select 'ALL' checkbox
              $scope.model[key].push(all);
            }  
          };
        }
        .....

plunker:https://plnkr.co/edit/LWRZSS6HuBmrzSG5fsH9