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.
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
@ SpiderWasp42 Kein Problem Kumpel! :) –