代码之家  ›  专栏  ›  技术社区  ›  Guzzyman

如何解决类型错误:angular.element(…).scope(…).selectFileForUpload不是函数[重复]

  •  -1
  • Guzzyman  · 技术社区  · 6 年前

    这个问题已经有了答案:

    我正在尝试使用angularjs在asp.net mvc中上载一个文件。我有以下作为我的文件上传界面。

    <form name="f1" class="form-horizontal" ng-submit="SaveFile()" novalidate>
        <div style="color: red">{{Message}}</div>
        <div class="col-md-12">
            <label>Select File:</label>
            <input type="file" name="file" accept="image/*"
                   onchange="angular.element(this).scope().selectFileForUpload(this.files)"
                   class="form-control input-bordered" required>                      
            <span class="text-danger" ng-show="(f1.file.$dirty || IsFormSubmitted) && f1.file.$error.required">Image required!</span>
            <span class="text-danger">{{ FileInvalidMessage }}</span>
        </div>
        <div class="col-md-12">
            <label>Description:</label>
            <input type="text" name="uFileDescription" class="form-control input-bordered {{(IsFormSubmitted?'ng-dirty' + (f1.uFileDescription.$invalid?' ng-invalid' : ''):'')}}" autofocus data-ng-model="FileDescription" />
        </div>
        <div class="col-md-12">
            <button type="submit" class="btn btn--primary">Upload File</button>
            <a href="#/FileUpload" class="btn btn--secondary">Cancel</a>
        </div>
    </form>
    

    出现上述错误的部分是:

     <input type="file" name="file" accept="image/*" onchange="angular.element(this).scope().selectFileForUpload(this.files)" class="form-control input-bordered" required>
    

    我的控制器的一部分将此函数作为范围变量。

          $scope.selectFileForUpload = function (files) {
                $scope.SelectedFileForUpload = file[0];
          }
    

    我应该做些什么来避免这个错误?

    1 回复  |  直到 6 年前
        1
  •  0
  •   georgeawg    6 年前
    ̶$̶s̶c̶o̶p̶e̶.̶s̶e̶l̶e̶c̶t̶F̶i̶l̶e̶F̶o̶r̶U̶p̶o̶a̶d̶(̶)̶{̶
    $scope.selectFileForUpload = function(files) {
       $scope.SelectFileForUpload = files[0];
    }
    

    坦率地说,函数名和变量名的大小写不同是不好的编程实践。这使得代码容易出错,而且很难阅读。


    而不是使用 angular.element(this).scope() ,我建议使用与 ng-model controller :

    app.directive("selectNgFiles", function() {
      return {
        require: "ngModel",
        link: function postLink(scope,elem,attrs,ngModel) {
          elem.on("change", function(e) {
            var files = elem[0].files;
            ngModel.$setViewValue(files);
          })
        }
      }
    });
    

    用法:

    <input type="file" name="file" accept="image/*"
           ̶o̶n̶c̶h̶a̶n̶g̶e̶=̶"̶a̶n̶g̶u̶l̶a̶r̶.̶e̶l̶e̶m̶e̶n̶t̶(̶t̶h̶i̶s̶)̶.̶s̶c̶o̶p̶e̶(̶)̶.̶s̶e̶l̶e̶c̶t̶F̶i̶l̶e̶F̶o̶r̶U̶p̶l̶o̶a̶d̶(̶t̶h̶i̶s̶.̶f̶i̶l̶e̶s̶)̶"̶
           select-ng-files ng-model="files"
           ng-change="selectFileForUpload(files)"
           class="form-control input-bordered" required>
    

    这个 .scope() 方法 angular.element 要求 Debug Data 要启用。这与AngularJS的小型版本不同。

    此外,使用 onchange 属性未与AngularJS执行上下文及其摘要循环集成。只有在AngularJS执行上下文中应用的操作才能受益于AngularJS数据绑定、异常处理、属性监视等。

    有关详细信息,请参见 ng-model for <input type=“file”/> (with directive DEMO)