一尘不染

如何在angularjs中使用input [type = file]验证表单

angularjs

HTML:

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

用于侦听输入[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。为什么我会收到此错误以及如何解决此问题的任何想法?


阅读 331

收藏
2020-07-04

共1个答案

一尘不染

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](http://plnkr.co/edit/yya3vMoaTFiONU9wrFVw?p=preview)**

2020-07-04