首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >角度服务和pouchdb

角度服务和pouchdb
EN

Stack Overflow用户
提问于 2015-03-21 09:02:51
回答 2查看 1K关注 0票数 0

如何使用angularjs服务调用pouchdb并将数据返回给控制器?我一直在为本地存储开发一个带有pouchdb的ionic应用程序。我在控制器中内置了一个简单的crud应用程序。现在,我想开始将pouchdb调用移动到一个服务中。我一直无法从服务中取回数据。如何使用服务调用pouchdb来获取所有文档并将其返回给控制器?

EN

回答 2

Stack Overflow用户

发布于 2015-03-21 21:26:03

我认为对Angular服务非常有效的一种策略是this one。它描述了一种保持内存中数组与PouchDB的allDocs()结果同步的方法。

由于它是一个自动与PouchDB保持同步的数组,您只需对其执行一个ng-repeat,就完成了。:)

票数 1
EN

Stack Overflow用户

发布于 2016-05-04 18:10:55

虽然你的问题已经提了一年了,但它值得一个答案。

您可能需要多个服务,即一个在控制器中使用,另一个用于后端数据库存储。例如,在控制器中:

代码语言:javascript
复制
(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
                }    
            );    
        }

    }
})();

对于后端,如下所示:

代码语言:javascript
复制
(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})); 
        }
    }
})();

在您的主控制器中,您需要设置数据库:

代码语言:javascript
复制
   $db.setLocalDB('yourDB'); 

希望这就是你要找的?

在我自己的数据服务模块中,我还有远程数据库、事件监听器、删除、同步、压缩、销毁等功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29178075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档