如果图像大小很大,则禁用 angularjs 表单提交按钮

Posted

技术标签:

【中文标题】如果图像大小很大,则禁用 angularjs 表单提交按钮【英文标题】:Disable angularjs form submit button if image size is big 【发布时间】:2017-01-17 01:03:31 【问题描述】:

我有一个表格

<div class="form-group">
  <input type="file" id="files" file-upload="myFile" ng-disabled="isBig" class="form-control" name="files" />
  <output id="list"></output>
</div>
<button type="submit" ng-disabled="isBig" class="btn btn-danger btn-block" ng-click="createUser()">Submit</button>

我有一个将文件绑定到范围的自定义指令,在此指令中,我创建图像对象并在 onload 方法中检查文件大小。如果文件大小大于指定限制,我想取消选择文件,禁用表单提交按钮并提醒用户选择较小尺寸的图像。如果大小更大,我尝试将 onload 方法中的范围属性设置为 true,但它不起作用。

app.directive('fileUpload', ['$parse',
  function($parse) 
    return 
      restrict: 'A',
      link: function(scope, element, attrs) 
        var model = $parse(attrs.fileUpload);
        var modelSetter = model.assign;
        element.bind('change', function() 
          scope.$apply(function() 
            if (element[0].files.length > 1) 
              modelSetter(scope, element[0].files);
             else 
              modelSetter(scope, element[0].files[0]);
              var file = element[0].files[0];
              if (file) 
                var img = new Image();

                img.src = window.URL.createObjectURL(file);

                img.onload = function() 
                  var width = img.naturalWidth,
                    height = img.naturalHeight;

                  window.URL.revokeObjectURL(img.src);
                  var isBig = false;

                  if (width <= 200 && height <= 200) 

                    modelSetter(scope, isBig);
                   else 
                    isBig = true;
                    modelSetter(scope, isBig);
                  
                ;
              
            
          );
        );
      
    ;
  
]);

任何关于我不正确的地方都将不胜感激。

【问题讨论】:

【参考方案1】:

如果按钮被禁用,

ng-click 仍然会触发,因为它是一个单击事件处理程序。 ng-disabled 将停止提交表单,因此请去掉按钮上的 ng-click="createUser()" 并将 ng-submit="createUser()" 放在表单上。

您也可以通过 ng-submit="formName.$valid && createUser()" 对表单字段进行验证,从而使表单无效。

image.onload 函数也会在作用域摘要之外触发,因此您需要另一个应用包装内部回调函数。

【讨论】:

我将 ng-click 更改为 ng-submit。如果方便的话,你能告诉我你在回调中的另一个应用包装是什么意思吗?因此,如果我想在范围上添加一些属性,然后可以在 isBig 等表单字段中使用,这是这样做的方法吗?【参考方案2】:

我找到了解决方案。阿德里安的意见帮助了我。如果有人需要,我会发布代码。我已将 ng-model 添加到指令中并设置视图值,然后在图像大小符合我们需要的情况下渲染它。也添加所需的表单输入。

//directive to set uploaded img file to the scope element
    app.directive('fileUpload', ['$parse',
      function ($parse) 
        return 
          require: 'ngModel',
          restrict: 'A',
          link: function(scope, element, attrs,ngModel) 
            var model = $parse(attrs.fileUpload);
            var modelSetter = model.assign;

            element.bind('change', function()

              scope.$apply(function()
                if (element[0].files.length > 1) 
                  modelSetter(scope, element[0].files);
                
                else 
                  modelSetter(scope, element[0].files[0]);
                  var file = element[0].files[0];
                  if( file ) 
                    var img = new Image();

                    img.src = window.URL.createObjectURL( file );

                    img.onload = function() 
                      var width = img.naturalWidth,
                      height = img.naturalHeight;

                      window.URL.revokeObjectURL( img.src );


                      if( width <=200 && height <=200 ) 

                        ngModel.$setViewValue(element.val());
                        ngModel.$render();
                      
                      else 
                        //fail
                      
                    ;
                  
                  else
                    ngModel.$setViewValue(element.val());
                        ngModel.$render();
                  
                
              );
            );

          
        ;
      
      ])

这是表单输入:

<form name ="addForm" ng-submit="createUser()" novalidate>

<div class="form-group">
                            <input type="file" id="files" ng-model="filename" required file-upload="myFile" class="form-control" name="files" accept="image/*"/>
                            <output id="list"></output>
                        </div>

                        <!-- Submit button. Note that its tied to createUser() function from addCtrl. Also note ng-disabled logic which prevents early submits.  -->
            <button type="submit" ng-disabled="addForm.$invalid" class="btn btn-danger btn-block">Submit</button>
                    </form>

【讨论】:

以上是关于如果图像大小很大,则禁用 angularjs 表单提交按钮的主要内容,如果未能解决你的问题,请参考以下文章

在 AngularJS 动态表单中禁用文本框

应禁用 angularjs 提交表单中的开始日期结束日期验证

AngularJs:为啥我们总是禁用表单提交按钮?

Jquery:如果表单没有变化,则禁用按钮

当表单使用 AngularJS 无效时禁用提交按钮

Angular JS - 如果使用 HTML 元素成功提交表单,则通知用户