AngularJS Service Singleton?

时间:2015-08-29 12:50:26

标签: javascript angularjs ionic

我对angularJS很新,但我读过服务应该是单身。然而,它不会'工作。 这是我的服务:

 .factory('TrainingPlan', function($http, SERVER){

   var o = {
     exercises: [],
     planID : 0
   };

   o.init = function(){
     if(o.exercises.length == 0)
      return o.getAllExercises();
   };

   o.getAllExercises = function(){
     $http({
       method: 'GET',
       url: SERVER.url + 'listener.php?request=getAllExercises&planID=' + o.planID
     }).then(function(data){

       o.exercises = angular.copy(o.exercises.concat(data.data));

       console.log("Exercises in Trainingplan Services");
       console.log(o.exercises);

       return o.exercises;
     })
     ;
   };

   o.getExercise = function(exerciseID){
     for(var i = 0; i < o.exercises.length; i++){
       if(o.exercises[i].exerciseID == exerciseID)
       {
         return o.exercises[i];
       }
     }
   };

  return o;
 })

我有两个控制器:

  .controller('TrainingDetailCtrl', function($scope, $stateParams, TrainingPlan, $timeout) {
   TrainingPlan.init();
    $timeout(function(){
      $scope.exercises = TrainingPlan.exercises;
      $scope.numberOfUnfishedExercises = $scope.exercises.length;
      button.innerHTML = "asdf";
    }, 250);
  })

(我还没有复制整个控制器,但它到目前为止工作......)

  .controller('TrainingHistoryEditCtrl', function($scope, $stateParams, TrainingPlan, $timeout) {
    var exerciseID = $stateParams.exerciseID;


    $scope.currentExercise = TrainingPlan.getExercise(exerciseID);
    console.log($scope.currentExercise);
  })

所以实际上我从TrainingDetailCtrl开始,在那里我有&#39; TrainingPlan&#39;的所有练习。但是,当我更改网站时,当我不想在TrainingHistoryEditCtrl中使用它们时,TrainingPlan不再进行练习。

1 个答案:

答案 0 :(得分:0)

这是因为您的$http发出了异步调用。即使您致电init,实际上当代码运行到行$timeout(function(){..时,结果可能尚未到达。

请查看此演示:JSFiddle。等待10秒钟,然后该值不为空。

解决方案:从工厂返回promise。在控制器内部使用then来传递回调函数。