AngularJS在$http promise中更新作用域
我正在构建一个应用程序,在浏览器端解析excel文件,然后将数据发布到节点。这一切都工作得很好,但我有麻烦让文件上传列表更新时,范围是AngularJS在$http promise中更新作用域,angularjs,Angularjs,我正在构建一个应用程序,在浏览器端解析excel文件,然后将数据发布到节点。这一切都工作得很好,但我有麻烦让文件上传列表更新时,范围是 $scope.upload = function() { var files = document.getElementById('upload').files; var i, f; for (i = 0, f = files[i]; i != files.length; ++i) { var reader = new F
$scope.upload = function() {
var files = document.getElementById('upload').files;
var i, f;
for (i = 0, f = files[i]; i != files.length; ++i) {
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
var workbook = XLSX.read(data, {type: 'binary'});
workbook.SheetNames.forEach(function(sheetName) {
var sheetData = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);
if(sheetData.length > 0){
Sheet.create(f.name, sheetName, sheetData).success(function(sheet){
$scope.sheets.push(sheet);
console.log($scope.sheets);
});
}
});
};
reader.readAsBinaryString(f);
}
}
“Sheet”是Sheet服务,create方法返回$http请求的结果。正确的工作表列表(包括新的工作表)会记录到控制台,但UI不会更新
<div class="drive-item" ng-repeat="sheet in sheets | filter:query " >...</div>
。。。
尝试在超时时包装更新代码。出现rootscope.inprogress错误的原因是调用scope时摘要正在运行。$apply。因此,注入$timeout(在此处放置$scope),然后
或
也将安全地调用摘要在更新作用域后尝试调用apply我尝试了返回未定义函数错误的
$scope.apply()
,以及返回未定义函数错误的$scope.$apply()
哪个rootscope.inprog错误。我将它放在success函数中,在我将新工作表推到工作表上之后。标记中的过滤器在做什么?你确定它工作正常吗?如果您的控制台日志显示了正确的列表,则$scope.sheets
将同步-请为您查看这些更改。不要这样做。必须使用$timeout
和阶段检查,然后使用$digest
意味着你做错了什么。从长远来看,使用黑客来修复它不会有任何帮助。Angular并不完美,有时你必须先打破他们对模型的概念,才能得到你想要的。说你永远不能违反规则是愚蠢的。该框架是为您服务的,而不是相反。当然,但这是一个处理a-synch范围更新的简单案例-它已经做了一百万次,几乎是angular的理想用例。如果他不能让它工作,他的代码就不能正确使用手头的工具。
// model updating code in async block
// ...
// end model updating code
$timeout(); // triggers digest safely
if (!$scope.$$phase) { // check if we are in digest
$scope.$digest(); // run digest
}