申报服务的正确方法是什么?
.service('myService', function(myFactory) {
myFactory.LoadData("...",function(newData){
this.data= newData;
});
}
或
.service('myService', function() {
var data= {};
myFactory.LoadData("...",function(newData){
data= newData;
return data ;
});
}
每次我使用它时都不想进行http调用但只需要一次,然后随时访问数据。
我尝试过第一个例子,但是当我尝试在我的控制器中使用它时,我得到'未定义'值。
编辑:
好的,这是我的代码:
服务:
.service('ClassService', function(ClassFactory) {
ClassFactory.query(function(rawClasses){
this.classes= [];
rawClasses.forEach(function(classe) {
var classeRow={};
classeRow.grade=classe.grade;
classe.branch.forEach(function(branch) {
classeRow._id=branch._id;
classeRow.branch= branch.name;
classeRow.fees= branch.fees;
branch.sub_class.forEach(function(subClass) {
classeRow.label=subClass.label;
classeRow.name= _getGradeName_(classeRow.grade)+(classeRow.branch || '')+ (subClass.label || '');
console.info('ClasseService hihihi!');
this.classes.push(_byValue_(classeRow));
console.log( this.classes);
}, this);
}, this);
}, this);
});
})
和控制器:
.controller('StudentController', function(StudentFactory, ClassService, $scope, $stateParams) {
//...
$scope.classes= ClassService.classes;
//but here console.log($scope.classes) gives 'undefined'
//...
});
答案 0 :(得分:1)
您服务中的查询是异步运行的,因此您需要使用promise来等待值变为可用。
如果你让ClassFactory.query()
返回一个承诺而不是使用回调,它将变得更加简单。使用thePromise.then()
中的ClassService
来处理完成,但这也会返回您应该向控制器公开的承诺。然后在控制器中使用另一个.then()
来了解数据何时可用。
假设您已更新ClassFactory.query()
以返回承诺:
.service('ClassService', function(ClassFactory) {
var promise =ClassFactory.query();
this.dataLoaded = promise.then(... the code to convert rawClasses to this.classes goes here...);
})
和
.controller('StudentController', function(StudentFactory, ClassService, $scope, $stateParams) {
//...
ClassService.dataLoaded.then(function () {
$scope.classes= ClassService.classes;
});
});