2016-07-09 20 views
0

Ich verwende ForerunnerDB - a NoSQL JSON Document DB zum Erstellen eines Datenspeichers auf dem Client (Web). Diese spezielle Bibliothek bietet eine persistence storage Option. Es scheint jedoch etwas falsch zu sein.Persistenzspeicher in ForerunnerDB funktioniert nicht richtig

App: Ich habe meinen Code unten enthalten

(function(){ 
angular.module("TestApp", ['ui.router', 'LocalStorageModule', 'forerunnerdb']); 

})();

Controller:

(function(){ 
    angular.module("TestApp") 
    .controller("FetchGroupsController", function(clientStore, $scope, $http){ 

     clientStore.getTable("groups").load(function (err, tableStats, metaStats) { 

      if (err) { 
       // Load operation was unsuccessful 
       console.error("error in pulling collection " + name); 
       console.error(err) 
      } 
      else{ 
       //there is persisted data corresponding to the requested table 
       if(tableStats.foundData && tableStats.rowCount > 0){ 
        controller.groups = clientStore.fetchRecords("groups"); //returns an array of objects 
        console.log("User has " + tableStats.rowCount + " groups"); 
        console.log(controller.groups); 
       } 
       else{//no table for group data persisted */ 
        $http({ method: "POST", url: "api/groups/index"}) 
        .success(function(data, status){ 
         //TODO: handle the activation code 
         if(status == 200){ 
          delete data["debug"]; //deleting an unnecessary object from response data 
          clientStore.addList("groups", data); 
          controller.groups = clientStore.fetchRecords("groups");  
          console.log(controller.groups); 
          clientStore.getTable("groups").save(); 
         } 
         else if(status == 403){ //forbidden 
          controller.messages = data; 
         } 
         else if(status == 401){ //error 
          controller.errors = data; 
         } 
        }) 
        ; 
       } 
      } 
     }); 


    }); 
})(); 

Service:

angular.module("TestApp") 
.factory('clientStore', function($fdb, $http, localStorageService){ 

    var clientDB = null; 
    var factory = {}; 

    clientDB = $fdb.db("testDB"); 

    factory.getDB = function(){ 
     return clientDB; 
    }; 

    factory.createTable = function(name, pk){ 
     if(pk != false){ 
      return clientDB.collection(name, {primaryKey : pk}); 
     } 
     return clientDB.collection(name); 
    }; 

    factory.resetTable = function(name){ 
     clientDB.collection(name)._data = []; 
     clientDB.collection(name).save(); 
    }; 

    factory.getTable = function(name){ 
     return clientDB.collection(name); 
    }; 

    factory.add = function(name, record){ //insert a single object 
     clientDB.collection(name).insert(record/*, function(result){ 
      console.warn(result); 
     }*/); 
    }; 

    factory.addList = function(name, records){ //insert a list of objects 

     for (record in records){ 
      clientDB.collection(name).insert(records[record]); 
     } 

    }; 

    factory.fetchRecords = function(name){ 
     return clientDB.collection(name)._data; 
    }; 

    return factory; 
}); 

Ausblick:

<div ng-repeat="group in fetchGrpsCtrl.groups" class="row"> 

    <div class="col-md-12"> 

     <div class="groups" id="[email protected]{{group.id}}" ng-click="fetchGrpsCtrl.setGroup(group)"> 

      <div class="details"> 

       <h5> @{{group.title}}</h5> 

      </div> 

     </div> 

    </div> 

</div> 

Das Problem ist, dass die var iable controller.group ist in der Ansicht null, aber im Controller erhalte ich den erwarteten Wert, wenn ich ihn (Zeile 15) an die Konsole auslogge. Ich dachte, dass es vielleicht ein Problem des Umfangs war und dass die Änderungen, die an der Variable innerhalb des Rückrufs vorgenommen wurden, nicht in der Ansicht aufgenommen wurden. Aber das ist nicht der Fall, weil ich die Zeile clientStore.getTable ("groups") auskommentiert habe. Save(); und lief es erneut und die Aussicht wurde perfekt wie erwartet aktualisiert. Ich kann nicht herausfinden, warum die Funktion save() die Variable controller.groups in der Ansicht löscht, aber im Controller perfekt ausgeloggt ist.

Antwort

0

Sie verwenden ForerunnerDB falsch. Es enthält ein AngularJS-Plugin, das die Verwendung mit AngularJS sehr einfach macht. Stattdessen haben Sie einen eigenen Wrapper geschrieben, der sich an die _data -Eigenschaft einer Sammlung bindet (etwas, das Sie nicht tun sollten, da diese Eigenschaft intern von ForerunnerDB verwaltet wird) und kann zerstört und neu erstellt werden, was bedeutet, dass Sie einen falschen Verweis auf ein Objekt haben, das möglicherweise nicht mehr von einer Sammlung verwendet wird.

Stattdessen sollten Sie ForerunnerDB in AngularJS verwenden, wie in der Dokumentation beschrieben: https://github.com/Irrelon/ForerunnerDB#angularjs-and-ionic-support

ForerunnerDB enthält eine Hilfsmethode namens „ng()“, die Sie aus einer Sammlung korrekt Daten Link zu Ihrer Ansicht des Oszilloskops ermöglicht.

Wenn JavaScript-Bibliotheken von Drittanbietern verwendet werden, werden Eigenschaften mit einem Unterstrich im Allgemeinen als "privat" betrachtet und sollten nicht direkt aufgerufen werden. Sie sollten stattdessen eine Zugriffsmethode verwenden (z. B. .find() im Fall von ForerunnerDB), um auf Daten zuzugreifen. Normalerweise ist eine Eigenschaft, die mit einem Unterstrich beginnt, ein guter Hinweis darauf, dass es privat ist (nicht alle Bibliotheken und Programmierer folgen dieser Konvention, aber viele tun dies).

+1

Ich benutze tatsächlich das eckige Plugin. Ich füge auch den App-Code hinzu, um die Verwirrung zu beseitigen. Ich habe den Dienst erstellt, um eine reibungslose Schnittstelle für die db zu haben, die ich app-weise hätte (fühlte mich nicht wohl mit $ rootScope). Ich vermisste die ng() - Hilfsmethode. Danke, dass du darauf hingewiesen hast. Es funktioniert jetzt reibungslos. Ich habe auch die Funktion fetchRecords() entfernt. Prost! – SpiderWasp42

+0

@ SpiderWasp42 Kein Problem Kumpel! :) –