AnguarJS:使用'this'指针或return语句

时间:2016-10-17 15:21:18

标签: angularjs angular-services

申报服务的正确方法是什么?

.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'
    //...
});

1 个答案:

答案 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;
    });
});