必需属性不适用于 Angular Js 中的文件输入

IT技术 javascript angularjs forms
2021-02-21 01:14:24

我的表单中有一个文件上传控件。我正在使用 Angular JS。当我放置必需的属性来验证文件被选中时,它不起作用。

<input id="userUpload" name="userUpload" required type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />

<button type="submit" class="btn btn-primary"><i class="icon-white icon-ok"></i>&nbsp;Ok</button>

你能建议为什么所需的不起作用吗?

2个回答

ngModelController基于require. 但是,目前不支持input type="file"ng-model 服务。为了让它工作,你可以创建一个这样的指令:

app.directive('validFile',function(){
  return {
    require:'ngModel',
    link:function(scope,el,attrs,ngModel){
      //change event is fired when file is selected
      el.bind('change',function(){
        scope.$apply(function(){
          ngModel.$setViewValue(el.val());
          ngModel.$render();
        });
      });
    }
  }
});

示例标记:

  <div ng-form="myForm">
    <input id="userUpload" ng-model="filename" valid-file name="userUpload" required type="file" accept="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" />
    <button ng-disabled="myForm.$invalid" type="submit" class="btn btn-primary"><i class="icon-white icon-ok"></i>&nbsp;Ok</button>
    <p>
      Input is valid: {{myForm.userUpload.$valid}}
      <br>Selected file: {{filename}}
    </p>
  </div>

查看我的工作 plnkr 示例

我已经为 IE 包含了 SHIV。我要放这个代码。这行得通吗?
2021-05-08 01:14:24
2021-05-11 01:14:24
我什至不知道你的代码是做什么的——我的 sniplet 应该是 IE8 兼容的。包括它,测试它,如果它在 IE8 中不起作用,则创建一个新问题
2021-05-14 01:14:24
您可以在 IE8 中测试run.plnkr.co/CEMX0RY3MX1TbcSZ(我刚刚做了并且效果很好)
2021-05-14 01:14:24
您的示例在 jQuery 中引发异常。
2021-05-15 01:14:24

扩展@joakimbl 代码我会建议直接这样

.directive('validFile',function(){
    return {
        require:'ngModel',
        link:function(scope,el,attrs,ctrl){
            ctrl.$setValidity('validFile', el.val() != '');
            //change event is fired when file is selected
            el.bind('change',function(){
                ctrl.$setValidity('validFile', el.val() != '');
                scope.$apply(function(){
                    ctrl.$setViewValue(el.val());
                    ctrl.$render();
                });
            });
        }
    }
})

在 html 中你可以这样使用

<input type="file" name="myFile" ng-model="myFile" valid-file />
<label ng-show="myForm.myFile.$error.validFile">File is required</label>
好的,我明白了......我将validFile更改为valid-file,并且我正在寻找myForm.myFile.$error.valid减号file
2021-05-13 01:14:24
这有点奇怪,但是正确使用您的代码会设置myForm.myFile.$error.validFile为 true,但是 ng-show 不起作用。使用myForm.myFile.$invalid工作正常。我不明白为什么会这样。我的角度检查员将 validFile 显示为 true ...
2021-05-19 01:14:24