Обратные вызовы Firebase и AngularJS
Я изучаю AngularJS в сочетании с Firebase. Я действительно борюсь сon
обратный вызов Firebase и пытается обновить$scope
...
$apply already in progress <----
var chat = angular.module('chat', []);
chat.factory('firebaseService', function ($rootScope) {
var firebase = {};
firebase = new Firebase("http://gamma.firebase.com/myUser");
return {
on: function (eventName, callback) {
firebase.on(eventName, function () {
var args = arguments;
$rootScope.$apply(function () {
callback.apply(firebase, args);
});
});
},
add: function (data) {
firebase.set(data);
}
};
});
chat.controller ('chat', function ($scope, firebaseService) {
$scope.messages = [];
$scope.username;
$scope.usermessage;
firebaseService.on("child_added",function(data){
$scope.messages.push(data.val());
});
$scope.PushMessage = function(){
firebaseService.add({'username':$scope.username,'usermessage':$scope.usermessage});
};
});
Если я возьму$rootscope.$apply
затем он работает как положено, но не обновляет DOM при загрузке страницы.
Спасибо!
ОБНОВИТЬ
Решение 1 - Удалить$rootscope.$apply
на сервисе и внедрить и применить$timeout
к контроллеру:
firebaseService.on('child_added',function(data){
$timeout(function(){
$scope.messages.push(data.val());
},0);
});
Решение 2. Внедрить метод SafeApply (благодаряАлекс Ванстон):
$scope.safeApply = function(fn) {
var phase = this.$root.$phase;
if(phase == '$apply' || phase == '$digest') {
fn();
} else {
this.$apply(fn);
}
};
Хотя они оба работают и не очень много кода, я чувствую, что они слишком хакерские. Есть ли какой-нибудь официальный Angular способ обработки асинхронных обратных вызовов?
Еще один замечательный пример, который я нашел для похожей ситуации:HTML5Rocks - AngularJS и Socket.io