AngularFire Firebase в сервисе AngularJS

Лучший способ обработки Firebase в AngularJS, безусловно, должен быть внутри службы, поэтому он доступен для всех контроллеров в приложении.

Я просто не могу заставить его работать! ... Сначала я попытался использовать 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


person stukennedy    schedule 19.09.2013    source источник
comment
Я думаю, что angularFire уже является сервисом, поэтому вы можете использовать его так, как он есть.   -  person Victor Bjelkholm    schedule 19.09.2013
comment
ну ... angularFire - это сервис, но он обеспечивает привязку к $scope, который вы выбрали, чтобы применить его, например. angularFire(new Firebase(url), $scope, 'value');. Это здорово, если я просто хочу использовать его в одном контроллере, но я хочу иметь возможность привязываться к пользовательской службе, чтобы я мог получать/редактировать/обновлять данные с любого контроллера, просто передавая службу. На сайте Firebase показано, как связать неявно и явно для текущей $scope.   -  person stukennedy    schedule 19.09.2013
comment
Удивительно, что на этот вопрос нет простого ответа (и примера Firebase), учитывая, что AngularJS продвигает использование сервисов angular для обмена состоянием/сервисами между контроллерами. Поэтому проголосовал.   -  person Michael Trouw    schedule 01.03.2014


Ответы (2)


Если вы хотите инкапсулировать некоторые функции в службу, рассмотрите возможность сохранения возвращаемой ссылки в состоянии службы. Я расширил ваш поршень. Кажется, в основном это то, для чего вы пытались.

http://plnkr.co/edit/Uf2fB0

person Jeff Ilse    schedule 19.09.2013
comment
Вы звезда!! ... это именно то, что мне нужно. - person stukennedy; 19.09.2013
comment
кажется, я сказал слишком рано ... Я не думаю, что это работает так, как ожидалось. Он привязывается к определенной области, но не к службе. И это позволяет вам привязать (setToScope) только один раз. Суть сервиса была в том, чтобы мы могли обращаться к модели с любого контроллера без использования rootScope. Я хотел бы иметь возможность привязать модель к контексту службы, а затем обновить Firebase, отредактировав объекты в модели службы. Или, может быть, я неправильно понял, как пользоваться сервисом. - person stukennedy; 21.09.2013
comment
хорошо... теперь я понял, и я был неправ... это позволяет вам привязываться к нескольким областям. Я внес несколько изменений в демонстрацию того, как я хочу это использовать, см. новый PLUNKER. - person stukennedy; 22.09.2013
comment
Спасибо тебе за это. Помогли мне с моим проектом - person wobsoriano; 16.12.2016

Джефф ответил на вопрос правильно... Просто выкладываю дальнейшую разработку на примере Джеффа для интересующихся.

Я абстрагировал создание службы 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 в свои контроллеры. Экземпляр инициализируется с использованием вашего URL-адреса Firebase, например.

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

Теперь Firebase можно привязать к вашему контроллеру, например.

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

адаптированный PLUNKER

person stukennedy    schedule 19.09.2013