【问题标题】:Accessing Returned data from Controller访问控制器返回的数据
【发布时间】:2016-09-19 10:14:20
【问题描述】:

我在工厂中有数据,可以在函数中的 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);
    });
  };

【问题讨论】:

  • console.log(data) 在 db.get('themeColor').then(function(data) 中返回什么?

标签: angularjs


【解决方案1】:

PouchDB 返回一个Promise。 Angular 在解析时需要知道Promise。因此,在您的控制器中,使用注入 $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() 的 Angular 文档

  2. 关于 Angular 的 $q.when() 的 PouchDB 注释。阅读部分Promises

【讨论】:

  • 我已经注入 $q 并且从 console.log(data) 中得到未定义
  • 我的控制器中的 console.log(data) 在 ThemeColor.getColor 运行之前运行,这就是为什么它返回 undefined 因此承诺不起作用
  • 我已经更新了代码。在factory 中进行编辑并使用您原来的controller 代码
  • 您可能需要编辑问题和标签以反映这是与 Pouch DB 和 angular 相关的问题。
【解决方案2】:

就这么简单:

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

【讨论】:

    【解决方案3】:

    您不能从 .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;
    });
    

    【讨论】:

      猜你喜欢
      • 2014-06-20
      • 2020-10-20
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      相关资源
      最近更新 更多