从Controller访问返回的数据

时间:2016-05-22 14:30:17

标签: angularjs

我在工厂中有数据,我可以在函数中的console.log中查看,如何将它放入我的控制器?

它刚刚回归未定义。

.factory('ThemeColor', function() {
    var db = new PouchDB('myDB');
    var self = {
      getColor: function(){
        db.get('themeColor').then(function(data){
          console.log(data);
          return data;
        });
      },
    }

    return self;
});

控制器

$scope.ThemeColor = function(){
  ThemeColor.getColor().then(function(data){
      console.log(data);
    });
  };

3 个答案:

答案 0 :(得分:1)

PouchDB返回Promise。 Angular在解析时需要知道Promise。因此,在您的控制器中,使用inject $q服务并将工厂包装在`$ q.when()中,如下所示:

.factory('ThemeColor', function($q) {
var db = new PouchDB('myDB');
var self = {
  getColor: function(){
  return $q.when(db.get('themeColor')).then(function (data) {          
      return data;
    }).catch(function(err){
      console.error(err);
   });
  }
}

return self;
});

您可以查看文档

  1. $q.when()

  2. 上的角度文档
  3. 关于Angular' $q.when()的PouchDB说明。阅读章节Promises

答案 1 :(得分:0)

简单如下:

$scope.ThemeColor = function(){
  $scope.color = null;
  ThemeColor.getColor().then(function(data){
    console.log(data);
    $scope.color = data; // i am color
  });
};

答案 2 :(得分:0)

你不能从.then(function(data){})返回一个值,因为function(data){}是回调。

您可以使用以下解决方案来满足您的需求:

控制器代码:

.controller('myCntrl', function($scope, ThemeColor) {
    function successCallback(res) {
        console.log(res);
    }

    function failureCallback(res) {
        // @TODO
    }


    $scope.ThemeColor = function(){
        ThemeColor.getColor(successCallback, failureCallback);
    };
});

服务代码:

.factory('ThemeColor', function() {
    var db = new PouchDB('myDB');
    var self = {
      getColor: function(successCallback, failureCallback){
        db.get('themeColor').then(function(data){
            successCallback(data);
        }, function(data) {
            failureCallback(data);
        });
      }
    }

    return self;
});