2015-08-29 5 views
1

Я довольно новичок в angularJS, но я читал, что услуги должны быть singleton. Однако это не будет работать. Вот моя служба:AngularJS Service Singleton?

.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, где у меня есть все упражнения «TrainingPlan». Однако, когда я меняю сайты, TrainingPlan больше не имеет упражнений, когда я не буду использовать их в TrainingHistoryEditCtrl.

+1

*** Служба поддержки AngeluarJS Singleton? -> 1000% Универсальная правда *** –

+0

Я думаю, что вы должны больше узнать об услуге в угловой. Пожалуйста, прочитайте этот ответ [Разница между сервисом, фабрикой и провайдером] (http://stackoverflow.com/questions/15666048/service-vs-provider-vs-factory) – Sapher

+0

Непонятно ... Не могли бы вы объяснить это подробнее ..? –

ответ

0

Это связано с тем, что ваш $http выдает асинхронный вызов. Даже если вы вызываете init, на самом деле, когда код работает до строки $timeout(function(){.., результат может еще не наступить.

Пожалуйста, проверьте это демо: JSFiddle. Подождите 10 секунд, тогда значение не будет пустым.

Решение: вернуть promise с завода. Внутри контроллера используйте then для передачи в функцию обратного вызова.