8

在 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 是一个包含大量方法等的对象。如果我将它绑定到控制器 $scope 我只会得到垃圾。它还抱怨在我尝试使用 Firebase 函数之前它无法调用它们(例如Error: Firebase.push failed: second argument must be a valid function.)......有人知道我哪里出错了吗?

看到这个PLUNKER

4

2 回答 2

12

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

http://plnkr.co/edit/Uf2fB0

于 2013-09-19T15:02:33.150 回答
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 URL 初始化实例,例如

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

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

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

改编的 PLUNKER

于 2013-09-19T23:01:57.920 回答