2015-03-21 7 views
0

Как вы используете услугу angularjs для вызова pouchdb и возврата данных в контроллер? Я работаю над ионным приложением с pouchdb для локального хранилища. У меня есть простое приложение crud, встроенное в контроллер. Теперь я хочу начать переводить вызовы pouchdb в службу. Я не смог вернуть данные из службы. Как использовать сервис для вызова pouchdb для получения всех документов и возврата его на контроллер?Угловой сервис и pouchdb

ответ

1

Одна стратегия, которая, как я думаю, может очень хорошо работать для Угловых служб - this one. В нем описывается метод хранения массива в памяти, синхронизированного с результатом PouchDB.

Поскольку это массив, который автоматически синхронизируется с PouchDB, вы можете просто сделать на нем ng-repeat, и все готово. :)

+0

Nolan, это действительно не по теме, но я ищу полную, эффективную передовую практику (полное небольшое или среднее приложение с открытым исходным кодом или демонстрационное приложение) с угловым pouchdb. Не могли бы вы порекомендовать один или два? – FlipOne

0

Хотя ваш вопрос - год, он заслуживает ответа.

Возможно, вам понадобится несколько сервисов, то есть один для использования в контроллере, а другой для хранилища базы данных. Например, в контроллере:

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

Надежда это это то, что вы искали?

В моем собственном модуле служб данных у меня есть другие функции для удаленной базы данных, прослушиватели событий, удаление, синхронизация, сжатие, уничтожение и т. Д.

Смежные вопросы