【问题标题】:angular-formly multiCheckbox Select All角度形式的 multiCheckbox 全选
【发布时间】:2016-03-14 21:38:05
【问题描述】:

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

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 被选中,那么所有的水果选项(苹果、橙子、梨、蓝莓)也应该被选中

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

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

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

【问题讨论】:

    标签: javascript angularjs angular-formly


    【解决方案1】:

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

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

    其中一些有点老套,但部分与 angular 如何实现复选框以及 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' 将出现在您的模型中。解决这个问题的一种可能方法是为它定义一个 $parser。

    不支持templateOptions.valueProp

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

    【讨论】:

    • 像魅力一样工作。在您的回答中为我学习了很多东西。感谢您的帮助
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是另一个可行的解决方案(实际上更新了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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-17
        • 1970-01-01
        • 2017-02-20
        • 1970-01-01
        • 2016-11-13
        相关资源
        最近更新 更多