2015-06-23 3 views
0

i использование угловой.js спереди.используя обещание с угловым.js

в моем controller.js я определил метод инициализации(), который будет вызываться в

инициализации моего контроллера.

Init определение метода:

var init = function() { 
$scope.callTeamsService(); 
if ($scope.teams.length == 0){ 
.... 
}else{ 
... 
} 
..... 

}; 

в $ scope.callTeamsService я заполнил $ scope.teams переменной.

$ scope.callTeamsService определение метода:

$scope.callTeamsService = function(){ 
     NavService.getTeams(function (response) { 
       $timeout(function() { 
        $scope.teams = response;       
        } 
       }, 200); 
      }); 
    }; 

В моем service.js я определил getTeams метода следующим образом:

service.getEquipes = function (callback) { 
$http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams') 
        .success(function (response) { 
         callback(response); 
        }); 
      }; 

Моей проблема когда $ сферы. teams.length == 0 условие достигнуто

service.getEquipes метод в моей службе.js еще не вызывается.

Как я могу изменить этот код, чтобы завершить выполнение $ scope.callTeamsService методом до достижения $ scope.teams.length == 0 состояние.

+0

Missing '«'здесь:'»/ команды)' , Типо? –

+1

'.then','.затем 'и' .then' – gr3g

+0

@ gr3g, где я могу добавить. then? –

ответ

2
service/factory 

    service.getEquipes = function() { 
     return $http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams'); 

     }; 


// controller 
    var promise = NavService.getTeams.then (
      function(data) { 
      //assign to $scope or do logic 
      }, 
      function(err){ 
       console.log(err) 
      } 
    ) 
2

Как я могу изменить этот код, чтобы завершить выполнение $scope.callTeamsService метода до достижения $scope.teams.length == 0 состояния.

Это навыворот - вам нужно ждать с выполнением условия $scope.teams.length == 0 пока метод $scope.callTeamsService не закончил.

Классический метод заключается в том, чтобы дать $scope.callTeamsService метод обратного вызова и вызвать его в таймаут вместо $scope.teams = response;. Затем вы можете поместить свое условие в функцию init в обратном вызове, который вы передаете.

Однако вы, кажется, хотите использовать обещания. Для этого, все ваших функций (что все асинхронные) должны return обещания:

service.getEquipes = function (callback) { 
    return $http.get(urlBase+'users/' + $rootScope.globals.currentUser.loggedUser.idUser + '/teams'); 
} 

(что было легко, $http уже возвращает обещания)

$scope.callTeamsService = function() { 
    return NavService.getTeams().then(function(teams) { 
     return $timeout(function() { 
      return teams; 
     }, 200); 
    }); 
}; 

$timeout делают, а также - по вызывая then и возвращение его из обратного вызова вы можете цепную их и получить новые перспективы для обоих)

function init() { 
    return $scope.callTeamsService().then(function(teams) { 
     $scope.teams = teams; 
     if (teams.length == 0) { 
      … 
     } else { 
      … 
     } 
    }); 
} 
+0

«$ timeout», скорее всего, потому, что OP действительно не понимает дайджесты, я подозреваю, что вам это действительно не нужно там. Это могут быть только команды возврата, что означает, что это может быть просто '$ scope.callTeamsService = NavService.getTeams'. –

+0

Хм, 200 казалось, что он хотел тайм-аут по какой-то причине ... По общему признанию, я не очень разбираюсь в '$ scope', посвященной обещаниям. – Bergi

+0

'' 'обработчики' '' 'запускаются в' evalAsync', что, в свою очередь, вызывает дайджест в области. –

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