如何将对象从角度服务返回到控制器

时间:2016-09-10 12:26:58

标签: angularjs

我有以下服务,

 .service('indexDBService', function ($indexedDB, firebaseService) {
   var objects = [];
   var addToVideos = [];
   var _this = this;

     firebaseService.getvideosApi().then(function(response){
          _this.videos = response.data;
          var userVideos = _this.videos;
          for (var key in userVideos) {
            if (userVideos.hasOwnProperty(key)) {
               var video = {"file_id": userVideos[key].file_id, "filename": userVideos[key].filename, "file_status": userVideos[key].file_status, "user_id": userVideos[key].user_id, "video_avatar": userVideos[key].video_avatar, "upload_date": userVideos[key].upload_date, "file_dislikes": userVideos[key].file_dislikes, "file_likes": userVideos[key].file_likes, "downloadUrl": userVideos[key].downloadUrl}
            addToVideos.push(video);
            }
          }
          if((objects.length) < (Object.keys(_this.videos).length)){

            $indexedDB.openStore('userVideos', function(store){
              store.upsert(addToVideos).then(function(e){
                // do something
              });
            });

          }
        });
       //get indexDB Videos
        $indexedDB.openStore('userVideos', function(store){
           store.getAll().then(function(userVideos) { 
            objects = userVideos;
            _this.vObjects = objects;
            });
        });
      });

我想在控制器中获取vObject,以便我可以在那里使用。如何将_this.vObjects返回或传递给我的控制器?

1 个答案:

答案 0 :(得分:1)

由于这是一个角度服务,你应该使用promises。 Promises允许您访问异步数据,您正在使用firebase和inddxdb服务。我将假设您正在使用_this.vobject来缓存服务中的数据,因此您不需要每次都发出请求。我会像你这样为你的服务注入$ q

. service('indexDBService',function($indexedDB, firebaseService,$q)

$ q是一个允许您构建承诺的API。在角度服务中,您通过将方法添加到此方法来公开方法。为了创建一个获取数据的方法,你可以像这样构建它。

this.getVobj = function(){ 

    var deferred = $q.defer()

    if(_this.vObjects){
       deferred.resolve(_this.vObjects);
     } else {

$indexedDB.openStore('userVideos', function(store){
       store.getAll().then(function(userVideos) { 
        objects = userVideos;
        _this.vObjects = objects;
       deferred.resolve(objects);
        });
    });
}

   return deferred.promise;

};

然后在您的控制器中获取它,您将注入您的服务。

myModule.controller('myCtrl', function(indexDBService){
           indexDBService.getVobj().then(function(vObj){
              //Do stuff with vobj
           });
});