我对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不再进行练习。
答案 0 :(得分:0)
这是因为您的$http
发出了异步调用。即使您致电init
,实际上当代码运行到行$timeout(function(){..
时,结果可能尚未到达。
请查看此演示:JSFiddle。等待10秒钟,然后该值不为空。
解决方案:从工厂返回promise
。在控制器内部使用then
来传递回调函数。