【问题标题】:Displaying files list using AngularJS and input[type=file]使用 AngularJS 和 input[type=file] 显示文件列表
【发布时间】:2015-06-28 04:32:49
【问题描述】:

我正在尝试显示用户使用 input[type=file] 选择的文件列表。

HTML

<div ng-app="myApp">
    <div ng-controller="UploadFilesCtrl">
        <input type="file" onchange="angular.element(this).scope().uploadFiles(this)" multiple />
        <ul>
            <li ng-repeat="name in filenames">
                {{name}}
            </li>
        </ul>
        <button ng-click="test()">PRINT</button>
    </div>
</div>

JS

app = angular.module('myApp');

app.controller('UploadFilesCtrl', ['$scope', function($scope){

    $scope.uploadFiles = function(element){

        var files = element.files;
        var filenames=[];

        for (i=0; i<files.length; i++){
            filenames.push(files[i].name);
        }


        $scope.files = files;
        $scope.filenames = filenames;   
        console.log(files, filenames);
    };


    $scope.test = function(){
        console.log($scope.files, $scope.filenames);
    }
}]);

由于某种原因,列表永远不会更新。

$scope 中的 filenamesfiles 变量永远不会在 uploadFiles 函数之外更新(当我在选择文件后单击 PRINT 按钮时,我得到 undefined)。

有什么想法吗?

谢谢!

【问题讨论】:

  • angular.element(this).scope().uploadFiles(this) 我想这不会导致角度摘要。这似乎是 directive 的工作,但同时您可以尝试 $scope.$apply(function() { $scope.files = files; }); 看看它是否真的是一个摘要问题
  • 我刚刚找到了你从这个 sn-p 得到的答案。在假设接受的答案是正确的之前,您应该read the comments :)
  • 你有什么错误吗?
  • $scope.apply 由于某种原因没有完成这项工作。我最终试图创建一个指令。谢谢!
  • 这在 Crome 和 IE 中可以正常工作,但在 Firefox 中无法正常工作,它会给出类似 TypeError: angular.element(...).scope(...).uploadFiles is not a function

标签: javascript angularjs angularjs-scope angularjs-ng-repeat


【解决方案1】:

你不需要 $scope.$apply()

.................................................. ..................................................... ..................................................... …………

您的代码看起来很不错。如果你做了我下面的事情,它应该可以工作。

但你只错过了一件事。但这是主要的。

我认为您可能会遇到以下错误

未捕获的错误:[$injector:modulerr] 无法实例化模块 myApp,原因如下: 错误:[$injector:nomod] 模块“myApp”不可用!您要么拼错了模块名称,要么忘记加载它。如果注册模块,请确保将依赖项指定为第二个参数。

请在您的浏览器控制台窗口中验证,如果出现此错误,请尝试此操作

app = angular.module('myApp',[]);

而不是

app = angular.module('myApp');

你错过了主模型中的空子模型('myApp',[]);

所有其他代码看起来都很好。

更新:

请看fiddler Demo,现在点击打印按钮会显示您选择的文件名。

【讨论】:

  • 为什么要投反对票?我已经更新了我的答案。 @pankajparkar
  • @ameshrajendran 我没有对此投反对票,但您的回答不正确?你理解错了,我认为OP已经做到了..
  • @RameshRajendran。 -1 ,您的第一行不是 OP 问题的答案。
  • 第一行不是 OP,而是@Sourabh- answer
  • @RameshRajendran。您可以在 cmets 中执行此操作。无论如何删除了downvote。 :)
【解决方案2】:

使用$scope.$apply() 更新您的$scope 对象

...
$scope.files = files;
$scope.filenames = filenames;   
$scope.$apply();
console.log(files, filenames);
...

休息正常。

编辑:

RGraham 是正确的。这不是一个完整的证明解决方案。您应该改用指令。但只是为了解决问题,您可以检查digest 是否正在像这样进行:

if ($scope.$root.$$phase != '$apply' && $scope.$root.$$phase != '$digest') {
    $scope.$apply();
}

更新小提琴http://jsfiddle.net/Sourabh_/HB7LU/13086/

【讨论】:

  • 这不是一个很好的解决方案。调试很好,但 OP 应该切换到使用不需要$scope.$apply 的指令。如果摘要已在进行中,您的代码将导致错误。
猜你喜欢
  • 2010-11-27
  • 1970-01-01
  • 2010-12-16
  • 1970-01-01
  • 1970-01-01
  • 2017-12-04
  • 2016-01-08
  • 2016-05-25
  • 1970-01-01
相关资源
最近更新 更多