【问题标题】:Passing data and variables from service to controller in AngularJS and PouchDB在 AngularJS 和 PouchDB 中将数据和变量从服务传递到控制器
【发布时间】:2015-09-25 02:05:07
【问题描述】:

我有一个如下所示的控制器:

angular.module('msfLogger', ['offClick', 'ngBootstrap', 'ngSanitize','ngCsv', 'angularFileUpload', 'pouchdb'])

.controller('LoggerCtrl',['$scope', 'dataService', 'pouchDB', function($scope, dataService, pouchDB){


var db = pouchDB('FleetDB');

$scope.addTodo = function() {
    var movement = {
        _id: moment().format("YYYYMMDDHHmmss"),
        type: 'move',
        duration:''
    };
    db.put(movement, function(err, res) {
    if (err) { console.log(err); }
    });
}

$scope.recordlist = dataService.get();
console.log($scope.recordlist);

第一个函数可以正常工作并将数据保存到数据库中。

然后,我尝试使用服务检索这些数据:dataService.get();

服务如下所示:

angular.module('msfLogger').service('dataService', extractRecords);

function extractRecords() {

    var data = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true})
    return {
        get: data;
    }
};

我收到 db is not defined 错误。

如何使服务中的 db 可用并将数据发送回控制器?

【问题讨论】:

    标签: javascript angularjs angularjs-scope pouchdb


    【解决方案1】:

    这里的问题是您在控制器中声明了您的 PouchDB 数据库,因此该变量不会在服务中公开,这就是 db is not defined 的原因。

    我在 Angular 中处理此问题的方法是创建一个服务或工厂来管理 PouchDB,因为两者都是单例,然后您可以将该服务注入您的 dataService,或在任何其他管理 PouchDB 的服务中使用它数据库。

    angular.module('msfLogger').service('pouchService', PouchService);
    
    function PouchService() {
      var self = this;
      self.db= new PouchDB('FleetDB');
    }
    

    在被注入而不是仅仅这样做之后:

    var data = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
    

    点那个:

    var db = pouchService.db;
    var data = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true});
    

    【讨论】:

    • 维克多的工作就像一个魅力!不过我有一个疑问! db.allDocs 返回一个承诺,在承诺的深处有我查询的对象数组。如何将这个 Promise 变成一个包含对象的简单数组?
    • @EricMitjans 不客气,是的,这是一个承诺,PouchDB 是异步的并返回一个回调或承诺,所以你应该使用它作为db.allDocs({options}).then(function (data) { //use your data }).catch(function (err) { //always catch it });
    【解决方案2】:

    将您的pouchDb 服务注入到您的服务中,就像您在控制器中所做的那样。

    angular.module('msfLogger').service('dataService', ['pouchDB',function(pouchDB){
    
        //get an instance of your db
        var db = pouchDB('FleetDB');
        var data = db.allDocs({startkey: 'move_', endkey: 'move_\uffff', include_docs: true})
            return {
                get: data;
        }
    }]);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-09
      • 2013-06-15
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      相关资源
      最近更新 更多