2016-02-22 3 views
0

В моем приложении 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 
} 
+0

Вы спрашиваете, почему console.log ($ scope.dataObj); печатает undefined вне if (file) {...}? –

+0

Да. console.log ($ scope.dataObj); печать не определена. Насколько я понимаю, в javascript у нас есть область функций. поэтому, даже если переменная определена в верхней части функции, если мы установим значение, мы сможем получить последнее значение после назначения. – zilcuanu

ответ

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

во время последнего console.log ($ scope.dataObj) нет никакой гарантии, что OnLoad уже уволили.

readAsText is async (Why is FileReader.readAsText() returning null?), что подразумевает, что submitForm остается перед запуском onload.

1

Как и CodeNashor, в вашей строке кода вы определили функцию r.onload и сделали назначение внутри этой функции, но r.onload выполняется после console.log($scope.dataObj); // prints undefined.

+0

Функция onload не является проблемой. Даже без него цикл $ apply-Cycle не заканчивается до запуска console.logs. $ watch или $ timeout помогут. – CodeNashor