AngularJS服务中的Firebase的AngularFire

时间:2013-09-19 12:13:01

标签: angularjs firebase angularjs-service angularfire

在AngularJS中处理Firebase的最佳方式肯定必须来自服务,因此它可供整个应用程序中的所有控制器使用。

我无法让它上​​班! ...我首先尝试使用angularFire(new Firebase(url)),希望我可以绑定到服务的范围,但Angular抱怨它不能$watch

所以我尝试使用angularFireCollection:

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;
        },
        ...
    };
});

但是,angularFireCollection是一个包含大量方法等的Object,如果我将它绑定到控制器$ scope我只是得到垃圾。它还抱怨它在我尝试使用之前无法调用Firebase功能(例如Error: Firebase.push failed: second argument must be a valid function.)......任何人都有任何想法我会出错?

请参阅此PLUNKER

2 个答案:

答案 0 :(得分:12)

如果要将某些功能封装到服务中,请考虑将返回的ref保持在服务状态。我扩大了你的plunker。它似乎主要是做你想要的。

http://plnkr.co/edit/Uf2fB0

答案 1 :(得分:6)

杰夫正确地回答了这个问题......我只是为那些感兴趣的人发布杰夫的例子。

我已经抽象了Firebase服务创建,因此您可以动态创建所需Firebase服务的实例: -

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);
            }
        };
    });
};

首先按如下方式创建服务实例

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

然后,您可以将itemsService服务注入您的控制器。该实例使用您的Firebase网址进行初始化,例如

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

Firebase现在可以绑定到您的控制器,例如

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

改编PLUNKER