无法在$ scope内获取值

时间:2016-02-22 12:44:38

标签: javascript angularjs angularjs-scope

在我的angularjs应用程序中,我有以下块,表现得非常奇怪。

我在功能块中声明了变量,但是尽管在功能块中设置了值,但无法访问这些值。哪里出错了。

$scope.submitForm = function (isValid) {
   var file = $scope.myFile;
   var contents;
   $scope.dataObj;
   if (file) {
       var r = new FileReader();
       r.onload = function (e) {
         console.log('Inside the file function ....');
         contents = e.target.result;
         $scope.$apply(function () {
           $scope.fileReader = contents;
           contents = contents.replace(/\r\n+/g, ",");
           $scope.dataObj = {hosts: contents};
           console.log($scope.dataObj); // prints the value twice
         });
       };
        r.readAsText(file);
   }
   console.log("Printing the data objects .... ");
   console.log($scope.dataObj); // prints undefined
}

3 个答案:

答案 0 :(得分:2)

$ scope。$ apply将在稍后的周期中作为您的代码执行。所以$ scope.dataObj将是未定义的(因为初始化'$ scope.dataObj;')和$ scope。$ apply将在当前的diggest周期之后运行。

在作业完成后我不知道你想做什么,但也许观察者会帮助你?

$scope.$watch('dataObj', function(){
   console.log($scope.dataObj);
});

有关角度生命周期的更多信息:http://onehungrymind.com/notes-on-angularjs-scope-life-cycle/

答案 1 :(得分:1)

在最后一个console.log($ scope.dataObj)时,无法保证onload已被触发。

readAsText是异步(Why is FileReader.readAsText() returning null?),这意味着在触发onload之前就会保留submitForm。

答案 2 :(得分:1)

与CodeNashor一样,在您的代码行中,您定义了r.onload函数并在该函数内部进行了赋值,但r.onloadconsole.log($scope.dataObj); // prints undefined之后执行。