2016-12-01 2 views
0

У меня проблема с моим скриптом, который собирает данные из базы данных по частям. Я хочу сообщить Angular, когда загрузка данных закончена, поэтому я использовал $ watch. К сожалению, это не работает. Функция угловых вызовов начинается в начале, а не после изменения значения загрузки.

angular 
.module('app') 
.controller('tlmController', function($scope, $http) { 
    var vm    = this; 
    var data   = []; 
    vm.countTestLines = 0; 
    vm.loadingComplete = false; 

    $scope.$watch('vm.loadingComplete', function() { 
     console.log(data); 
    });  

    $http({ 
     method: 'GET', 
     url: 'app/server/tt/count_testlines.php' 
    }).then(function successCallback(response) { 
     vm.countTestLines = parseInt(response.data.count); 

     downloadInParts(data, 0, vm.countTestLines); 

    }, function errorCallback(response) { 
     console.log('error'); 
    }); 

    var downloadInParts = function(data, offset, max) {   
     if(max < offset) { 
      vm.loadingComplete = true; 
      return; 
     } 

     $http({ 
      method: 'GET', 
      url: 'app/server/tt/get_testlines.php', 
      params: { offset: offset } 
     }).then(function successCallback(response) { 
      data = data.concat(response.data);   
      downloadInParts(data, offset + 5, max); 
     }, function errorCallback(response) { 
      console.log('error'); 
     }); 


    } 

}); 
+0

Я не угловатый парень, но вы пытались передать newValue и oldValue в качестве параметра слушателя в метод '$ watch'? И затем в него вы можете проверить 'if (newValue! == oldValue)' и обработать свои изменения. –

+0

Если один из ответов ниже решит вашу проблему, пожалуйста, подумайте о принятии одного из них в качестве ответа. – Danscho

ответ

0

Проблема заключается в том, что loadingComplete не является частью сферы. вы должны объявить его $scope.loadingComplete;.

+0

Да, это часть области как vm = this! – Danscho

+0

Насколько я знаю, loadComplete становится свойством контроллера. чтобы использовать часы, loadComplete должен быть свойством объекта $ scope. – asdadasfff

+0

Не обязательно. Если вы используете синтаксис controllerAs. Взгляните на этот стиль: https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md#style-y032 – Danscho

0

Если вы используете var vm = this, который надлежащим образом в соответствии с JohnPapa's styleguide для AngularJS, вы должны переписать $ часы:

$scope.$watch(function(){ return vm.loadingComplete }, function() { 
    console.log(data); 
}); 

Обновление от комментариев: Ваш параметр функции data скрывает ваш data переменная от вашего контроллера.

+0

Я вижу прогресс, но теперь консольный журнал возвращает пустой массив (но данные переменной заполняются должным образом) –

+0

Установил ли он загрузку Completed true, а затем запускает $ watch? – Danscho

+0

Мне пришлось использовать vm.data вместо локальной переменной данных. Я не знаю, почему, потому что переменная данных должна быть видимой в области функций. –

0

Поскольку вы используете 'vm' вместо '$ scope', вам необходимо вставить $ scope. $ Apply в вашу функцию.

if(max < offset) { 
    vm.loadingComplete = true; 
    $scope.$apply(); 
    return; 
    } 

$ сфера всегда следит за изменением стоимости и, если есть, Угловое будет вызывать функцию $ дайджеста() внутри и измененное значение будет обновляться. Использование 'vm' не будет обновлять значение, которое приводит к вашей проблеме.

Смежные вопросы