/ / Firebase's AngularFire in un servizio AngularJS - angularjs, firebase, angularjs-service, angularfire

Firebase's AngularFire in un servizio AngularJS - angularjs, firebase, angularjs-service, angularfire

Il modo migliore di gestire Firebase in AngularJS deve essere sicuramente all'interno di un servizio, quindi è disponibile per tutti i controller di tutta l'app.

Non riesco a farlo funzionare! ... Ho provato a usare per la prima volta angularFire(new Firebase(url)), sperando di potermi legare allo scopo del servizio, ma Angular si lamenta di non poterlo fare $watch esso.

Così ho provato angularFireCollection invece in questo modo:

app.factory("myService", function myService(angularFireCollection) {
var url = "https://myfirebase.firebaseio.com";
return {
getAll: function(path) {
var ref = angularFireCollection(new Firebase(url + "/" + path));
console.log(ref);
return ref;
},
...
};
});

Tuttavia, angularFireCollection è un oggettocontenente un carico di metodi, ecc. se lo lego a un controller $ scope, ottengo solo rifiuti. Si lamenta inoltre che non è possibile chiamare le funzioni Firebase prima di provare a utilizzarle (ad es. Error: Firebase.push failed: second argument must be a valid function.) ... Qualcuno ha qualche idea in cui sto andando male?

Guarda questo PLUNKER

risposte:

12 per risposta № 1

Se vuoi incapsulare alcuni deifunzionalità in un servizio, considerare la possibilità di mantenere lo stato di riferimento restituito nel servizio. Ho ampliato il tuo plunker. Sembra fare principalmente quello che stavi cercando.

http://plnkr.co/edit/Uf2fB0


6 per risposta № 2

Jeff ha risposto correttamente alla domanda ... Sto solo postando un ulteriore sviluppo sull'esempio di Jeff per coloro che sono interessati.

Ho astratto la creazione del servizio Firebase, così puoi creare dinamicamente un'istanza di qualunque servizio Firebase tu voglia: -

var registerFirebaseService = function (serviceName) {
app.factory(serviceName, function (angularFire) {
var _url = null;
var _ref = null;

return {
init: function (url) {
_url = url;
_ref = new Firebase(_url);
},
setToScope: function (scope, localScopeVarName) {
angularFire(_ref, scope, localScopeVarName);
}
};
});
};

Per prima cosa crea un'istanza del servizio come segue

registerFirebaseService("itemsService"); // create itemsService instance

Quindi puoi iniettare il itemsService servizio nei tuoi controllori. L'istanza viene inizializzata utilizzando l'URL di Firebase, ad es.

itemsService.init("https://firebase.firebaseio.com/" + userId + "/items");

Il Firebase può ora essere associato al tuo controller, ad es.

itemsService.setToScope($scope, "items");

adattato PLUNKER