角度服务和pouchdb

时间:2015-03-21 01:02:51

标签: angularjs pouchdb

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

2 个答案:

答案 0 :(得分:1)

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

由于它是一个自动与PouchDB保持同步的数组,因此您可以在其上执行ng-repeat,然后就完成了。 :)

答案 1 :(得分:0)

虽然你的问题是一年之久,但值得回答。

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

(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'); 

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

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }
}

希望这是你在找什么?

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