如何在单击按钮时将嵌套形式的状态更改为只读

How to change state of nested formly form to readonly on click of a button

我的问题很简单。

我有的东西

-- 我使用从后端接收的数据 (JSON) 制作的表格。

-- 表单将是多级嵌套的(目前是两级嵌套)。

-- 有一个与每个嵌套表单元素相关联的转发器,它会在单击按钮时向表单添加另一个元素。

-- 页面顶部将有一个按钮,用于将表单元素的状态切换为只读。

我面临的问题

-- 当我点击按钮时,表单元素的状态变为只读,除了嵌套的

我想要的

--当我单击按钮时,表单的每个元素都应将其状态更改为只读,无论是否嵌套。

这里是控制器...后面是JS-Bin link.

app.controller('MainCtrl', function MainCtrl(formlyVersion) {
  var vm = this;

  vm.onSubmit = onSubmit;
  vm.exampleTitle = 'Nested Repeating Section';
  vm.options = {
    formState: {
      readOnly: true
    }
  };

  init();

  vm.originalFields = angular.copy(vm.fields);


  function onSubmit() {
    alert(JSON.stringify(vm.model), null, 2);
  }


  function init() {
    vm.fields = [{
      key: 'name',
      type: 'input',

      templateOptions: {
        label: 'Name',
        required: true,
        minlength: 5,
        maxlength: 25
      }
    }, {
      key: 'description',
      type: 'textarea',

      templateOptions: {
        label: 'Description',
        rows: 5,
        maxlength: 100
      }
    }, {
      wrapper: 'panel',
      templateOptions: {
        label: 'Cars'
      },
      fieldGroup: [{
        type: 'repeatSection',
        key: 'cars',
        templateOptions: {
          btnText: '+',
          fields: [{

            wrapper: 'panel',
            templateOptions: {
              label: 'New car'
            },
            fieldGroup: [{
              key: 'carname',
              type: 'input',
              templateOptions: {
                label: 'Name',
                required: true,
                maxlength: 25
              }
            }, {
              key: 'cardesc',
              type: 'input',
              templateOptions: {
                label: 'Description',
                maxlength: 50
              }
            }]
          }]
        }
      }]
    }];
  }
});

http://jsbin.com/sunocaf/edit?html,js,output

提前致谢

P.S。 - 我从官方 angular 正式网站上拿了这个例子。

这只会使输入只读,不会影响单选按钮或复选框。按钮就此而言。

要执行您想要的操作,请将按钮中的 ng-click 事件设置为:

ng-click="readOnly()"

然后在控制器中:

   $scope.readOnly = function() {
       $(document).ready(function () {
            $('input').click(function (e) {
                e.preventDefault();
            });
        });
   };

这将阻止任何输入的发生。如果您需要 hide/disable 个按钮,您可以将只读标志设置为 true 并将按钮上的 ng-show 或 ng-disabled 设置为 !model.readOnly.

如果你想假装你正在使用 angular 而不是 jQuery,即使 angular.element 是 jQuery 的别名(直接从 angular 文档),那么你可以这样做:

 $scope.readOnly = function() {
     angular.element(function() {
            angular.element('input').trigger('click')(function(e) {
                e.preventDefault();
            };
       });
 };

我找到了解决我的问题的方法。我仍然通过按钮控制禁用功能,唯一的区别是我为表单的重复部分使用了单独的控制器。

这样我就可以使用数据服务向重复部分的控制器提供一个标志,以使其与整个表单一起被禁用。

为此,我不得不稍微调整重复部分的包装器,但最终结果正是我想要的。

干杯。