【发布时间】:2015-01-26 00:58:18
【问题描述】:
我有一个奇怪的问题(至少对我而言),希望有人能提供帮助。也许我只是在想这个错误的方式或什么的。尝试在 javascript 中处理文件对我来说是全新的。
我有一个指令,其模板如下所示:
<input type="file" ng-file-select ng-model="files">
<button ng-click="onFileSelect()">Upload</button>
在指令的控制器中,我正在这样做:
$scope.onFileSelect = function() {
reader = new FileReader();
reader.onload = function() {
$scope.file_contents = this.result;
};
reader.readAsArrayBuffer($scope.files[0]);
//debugger;
$scope.$watch('file_contents',function(file_contents) {
console.log(file_contents);
if (angular.isDefined(file_contents)) {
... bunch of code attempting to deal with file_contents ...
}
});
};
我选择一个文件,然后单击上传按钮。 (file_contents) 的 console.log 未定义。只有当我第二次点击按钮时,它才有值。
如果我取消注释调试器,$scope.file_contents 在我检查它的时候就有了一个值。
所以,file_contents 需要一点时间来设置(这是意料之中的),但 $watch 似乎从来没有注意到?这有什么奇怪的原因吗? $watch 不能与 FileReader 对象一起使用吗?
编辑 1:
好的。这里有更多信息。按照 PSL 的建议,我现在有了这样的代码:
$scope.onFileSelect = function() {
reader = new FileReader();
reader.onload = function() {
file_contents = this.result;
upload_file($scope.files[0],file_contents);
};
reader.readAsArrayBuffer($scope.files[0]);
};
upload_file = function(file,file_contents) {
<lots of cool file_contents-y stuff>
};
为什么我仍然收到 $digest 错误?我没有 $watches 了。我没有对upload_file 中的$scope 做任何事情。也没有来自 $digest 错误的堆栈跟踪来帮助我。我得到的只是:
Error: [$rootScope:inprog] $digest already in progress
http://errors.angularjs.org/1.3.0-beta.10/$rootScope/inprog?p0=%24digest
这是怎么回事?
【问题讨论】:
标签: javascript angularjs filereader