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 № 1Se 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.
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