Передача данных и переменных из сервиса в контроллер в AngularJS и PouchDB

0

У меня есть контроллер, который выглядит так:

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 доступным в службе и отправить данные обратно контроллеру?

Теги:
angularjs-scope
pouchdb

2 ответа

1
Лучший ответ

Проблема здесь в том, что вы объявляете свою базу данных PouchDB в контроллере, поэтому переменная не отображается в службе и что db is not defined.

Способ, которым я подхожу к этому в Angular, заключается в создании Сервиса или Фабрики для управления PouchDB, поскольку оба являются синглонами, тогда вы можете внедрить эту услугу в свою службу dataService или использовать ее в любой другой службе, которая управляет БД.

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});
  • 0
    Виктор, который работал как шарм! У меня есть сомнения, хотя! db.allDocs возвращает обещание, и глубоко внутри обещания есть массив объектов, к которым я обращаюсь. Как превратить это обещание в простой массив с объектами?
  • 0
    @EricMitjans, добро пожаловать, да, конечно, это обещание, PouchDB является асинхронным и возвращает обратный вызов или обещание, поэтому вы должны использовать его как db.allDocs({options}).then(function (data) { //use your data }).catch(function (err) { //always catch it });
1

Внесите свой сервис 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;
    }
}]);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню