Как вы используете услугу angularjs для вызова pouchdb и возврата данных в контроллер? Я работаю над ионным приложением с pouchdb для локального хранилища. У меня есть простое приложение crud, встроенное в контроллер. Теперь я хочу начать переводить вызовы pouchdb в службу. Я не смог вернуть данные из службы. Как использовать сервис для вызова pouchdb для получения всех документов и возврата его на контроллер?Угловой сервис и pouchdb
ответ
Одна стратегия, которая, как я думаю, может очень хорошо работать для Угловых служб - this one. В нем описывается метод хранения массива в памяти, синхронизированного с результатом PouchDB.
Поскольку это массив, который автоматически синхронизируется с PouchDB, вы можете просто сделать на нем ng-repeat
, и все готово. :)
Хотя ваш вопрос - год, он заслуживает ответа.
Возможно, вам понадобится несколько сервисов, то есть один для использования в контроллере, а другой для хранилища базы данных. Например, в контроллере:
(function() {
'use strict';
angular
.module('app.services')
.factory('db',db);
db.$inject = ['$db'];
function db($db) {
var data = {}; // set up a data object to receive document(s)
return {
getDoc: getDoc,
getList: getList,
save: save,
saveBatch: saveBatch
};
// get a single document using the id
function getDoc(id) {
$db.getDoc(id)
.then(
function onSuccess(doc) {
// success so update the view model
angular.extend(data,doc); // use angular.extend to shallow copy object so that it can be returned in full
},
function onError() {
// failure to get document
}
);
return data;
}
// retrieve a group of documents where key is the prefix of the data you want
function getList(key) {
$db.getList(key).then(
function onSuccess(docs) {
// success so update the view model details
angular.forEach(docs.rows, function (value) {
this.push(value.doc);
}, data);
// now you can sort data or anything else you want to do with it
},
function onError() {
// no data found
}
);
return data;
}
// save a single viewItem
function save(viewItem) {
$db.update(viewItem).then(
function onSuccess() {
// success so update view model if required
},
function onError(e) {
console.log(e); // unable to save
}
);
}
// save an array of viewItems
function saveBatch(viewItems) {
$db.updateBatch(viewItems).then(
function onSuccess() {
// success so update the view model if required
},
function onError(e) {
console.log(e); // unable to save
}
);
}
}
})();
Для внутреннего интерфейса, что-то вроде этого:
(function() {
'use strict';
angular
.module('app.services')
.factory('$db',$db);
$db.$inject = ['$q'];
function $db($q) {
var db;
return {
setLocalDB: setLocalDB,
update: update,
updateBatch: updateBatch,
getDoc: getDoc,
getAllDocs: getAllDocs,
getList: getList
};
// ------ DATABASE OPENING HANDLER(S) ------
// set to any named database
function setLocalDB(dbName) {
db = new PouchDB(dbName);
return db.info()
.catch(failedCheck()); // returns a promise to either work or fail
}
// return a rejection for a failure
function failedCheck() {
return $q.reject();
}
// ------ DOCUMENT HANDLING ------
// update document but if errors occur recurse qUpdate until either complete or retries exhausted
function update(doc) {
var counter = 0;
return $q.when(qUpdate(doc,counter));
}
// this routine works for both new and existing documents
function qUpdate(doc,counter) {
return db.put(doc)
.then(function() {
console.log('success - new document');
})
.catch(function(e) {
console.log(e); // not a new document so try as a revision of existing document using _id to find
return db.get(doc._id)
.then(function(origDoc) {
doc._rev = origDoc._rev; // get document revision _rev
return db.put(doc,doc._id,doc._rev)
.then(function() {
console.log('success - revision of document');
})
.catch(function(e){
console.log(e); // log error for failure
});
})
.catch(function(e){
console.log(e); // log error before we take any other action
counter ++; // increment counter, so we can limit retries (5 by default)
if (counter< 5) {
switch (e.status) {
case 404:
delete doc._rev; // remove revision information so we can see if this works
return qUpdate(doc); // might be deleted so return revised document for retry
case 409:
return qUpdate(doc); // in conflict so try again
default:
try {
throw new Error("cannot save: " + doc._id); // cannot go any further so throw new error
} catch(err) {
console.log(err); // log error for failure
}
}
} else {
try {
throw new Error("cannot save" + doc._id); // cannot go any further so throw new error
} catch(err) {
console.log(err); // log error for failure
}
}
});
});
}
// update a document batch stored in an array
function updateBatch(docs) {
return $q.when(qUpdateBatch(docs));
}
// do the actual update of a batch
function qUpdateBatch(docs) {
db.bulkDocs(docs).then(function(res) {
for (var i=0; i < res.length; i++) {
if (res[i].status === 409) {
update(docs[i]); // in conflict so try this document separately
}
}
}).catch(function(e){
console.log(e); // log error
});
}
// get the document as an angular promise and deal with it in host routine
function getDoc(id) {
return $q.when(db.get(id));
}
// get all documents
function getAllDocs() {
return $q.when(db.allDocs({include_docs: true, attachments: false}));
}
// get a batch of documents between a start and end key
function getList(key) {
return $q.when(db.allDocs({startkey: key, endkey: key + '\uffff', include_docs: true, attachments: false}));
}
}
})();
В вашем основном контроллере вы хотите установить базу данных:
$db.setLocalDB('yourDB');
Надежда это это то, что вы искали?
В моем собственном модуле служб данных у меня есть другие функции для удаленной базы данных, прослушиватели событий, удаление, синхронизация, сжатие, уничтожение и т. Д.
- 1. угловой сервис и HTTP запрос
- 2. Угловой сервис Factory Factory
- 3. Угловой сервис Singleton Использование?
- 4. Сброс Угловой сервис
- 5. Угловой JS Factory, сервис и HTTP-использование
- 6. Угловой сервис и контролер общей области
- 7. сеттер и геттер, используя угловой сервис/завод
- 8. Угловой-Диалог-Сервис и удобочитаемость модального кода
- 9. Угловая PouchDb и Auth Пример
- 10. Одноразовый разрешающий синглтон (угловой сервис)
- 11. Угловой сервис возвращает пустой объект
- 12. Угловой фильтр Сервис внутри Контроллер
- 13. частный угловой сервис или контроллер
- 14. Угловой 2 - Сервис в обслуживании
- 15. Угловой JS Сервис не определен
- 16. Угловой сервис возврат не определено
- 17. Угловой сервис JS не набирается
- 18. угловой сервис в приложение конфигурации
- 19. PouchDB и связанные документы
- 20. Угловой, вводя собственный сервис в провайдера
- 21. Угловой JS пользовательский сервис callback не работает
- 22. Угловой 2 Сервис + RxJS BehaviorSubject или EventEmitter
- 23. Угловой ионную приложения: зависимость ошибки при попытке углового-pouchdb
- 24. Угловой сервис Array.filter vs basic for loop
- 25. Угловой 2 HTTP-сервис не возвращает обещание
- 26. Фильтр через сервис изнутри угловой директивы
- 27. Угловой-модальный сервис не показывает модальный
- 28. Угловой сервис DB pers persist Данные
- 29. mocking угловой сервис для контрольных контроллеров
- 30. Угловой-cli: ng сервис без оптимизаций
Nolan, это действительно не по теме, но я ищу полную, эффективную передовую практику (полное небольшое или среднее приложение с открытым исходным кодом или демонстрационное приложение) с угловым pouchdb. Не могли бы вы порекомендовать один или два? – FlipOne