Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AngularJS在$http promise中更新作用域_Angularjs - Fatal编程技术网

AngularJS在$http promise中更新作用域

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

我正在构建一个应用程序,在浏览器端解析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 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
}