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