24

HTML:

<form name="form">
    <input type="file" ng-model="document" valid-file required>
    <input type="submit" value="{{ !form.$valid && 'invalid' || 'valid' }}">
</form>

用于侦听 input[type=file] 更改的自定义指令:

myApp.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();
                 });
            });
        }
    };
});

选择文件时,控制台中会出现以下错误:

错误:InvalidStateError:DOM 异常 11 错误:尝试使用不可用或不再可用的对象。

尝试使用 plunkr:http ://plnkr.co/edit/C5j5e0JyMjt9vUopLDHc?p=preview

如果没有该指令,输入文件字段的状态将不会被推送到 form.$valid。任何想法为什么我会收到此错误以及如何解决此错误?

4

2 回答 2

29

来自NgModelController.$render()的参考

当视图需要更新时调用。预计 ng-model 指令的用户将实现此方法。

您需要实现 $render() 来调用它。你可以做这样的事情

myApp.directive('validFile', function () {
    return {
        require: 'ngModel',
        link: function (scope, el, attrs, ngModel) {
            ngModel.$render = function () {
                ngModel.$setViewValue(el.val());
            };

            el.bind('change', function () {
                scope.$apply(function () {
                    ngModel.$render();
                });
            });
        }
    };
});

DEMO

于 2013-08-22T14:49:17.117 回答
4

更新到 AngularJS 1.2.x 后,代码段看起来不再正常工作,并且文件输入与所选文件值不一致,导致表单无法使用。将指令改回原来的指令,并删除ngModel.$render()它看起来像一个魅力:

.directive('validFile', function () {
  return {
    restrict: 'A',
    require: '?ngModel',
    link: function (scope, el, attrs, ngModel) {
      el.bind('change', function () {
        scope.$apply(function () {
          ngModel.$setViewValue(el.val());
        });
      });
    }
  };
于 2013-11-26T02:38:48.533 回答