当前位置: 首页 > 面试题库 >

Firebase回调和AngularJS

颜镜
2023-03-14
问题内容

我正在与Firebase一起学习AngularJS。我真的很努力与onFirebase 的回调,并试图更新$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”方法(感谢Alex Vanston):

$scope.safeApply = function(fn) {
        var phase = this.$root.$$phase;
        if(phase == '$apply' || phase == '$digest') {
            fn();
        } else {
            this.$apply(fn);
        }
    };

尽管它们都可以工作并且代码也不多,但我还是觉得它们太笨拙了。是否有某种正式的Angular方式来处理html" target="_blank">异步回调?

我针对类似情况找到了另一个很好的例子:HTML5Rocks-
AngularJS和Socket.io


问题答案:

解决方案1-删除$ rootscope。$在服务上应用并注入$ timeout并将其应用于控制器:

firebaseService.on('child_added',function(data){        
    $timeout(function(){
        $scope.messages.push(data.val());                       
    },0);
});

解决方案2-实施“ SafeApply”方法(感谢Alex Vanston):

$scope.safeApply = function(fn) {
        var phase = this.$root.$$phase;
        if(phase == '$apply' || phase == '$digest') {
            fn();
        } else {
            this.$apply(fn);
        }
    };


 类似资料:
  • 主要内容:分离事件类型的回调,分离所有回调本章将向学习如何分离Firebase中的回调。 分离事件类型的回调 下面将分离一个具有值事件类型的函数的回调。 示例 可使用方法,这将删除所有值事件类型的回调。 分离所有回调 当想要分离所有的回调,我们可以使用 -

  • 我的应用程序结构有点乱,但我必须先添加这个补丁,然后我会重新构建整个逻辑。问题是我首先检查是否有Firebase用户,然后如果有,我使用StreamBuilder从FiRecovery获取当前用户配置文件,然后我有_firebaseMessaging.configure方法,因为onLaunch和onResume我使用这个回调: 因为我需要将用户发送到这个屏幕,在那里他从Firebase获取消息。

  • 问题内容: 我正在编写一个函数,该函数采用groupchatID(字符串),并为该群聊返回收件人列表([String])。我正在努力与功能的异步部分。当我运行该函数时,它将正确地将我要查找的用户名数组打印到控制台。虽然,当我调用该函数并尝试打印返回的值时,它始终是一个空数组,因为该函数会在Firebase调用完成之前返回该数组。我正在尝试使用回调,但是我不太了解所有语法。请看一下,让我知道需要更改

  • 当应用程序开始时,我正在从Firebase存储加载一些数据,我正在设置'on成功监听器'和'onFailureListener'以在加载完成时隐藏进度条。问题是:当我离线尝试应用程序时,我根本没有收到回调。我尝试了onCompleteListener,但它也没有被调用它在控制台中给我提供了以下消息: 然后,只要应用程序正在运行,就会显示以下消息: 等待了这么长时间后,它最终给出一个错误并触发“失败

  • 我试图理解一个API参考描述,但我很难理解它的含义: http://mongodb.github.io/node-mongodb-native/2.2/api/Cursor.html#toArray 上面写着 'toArray(回调)- 我知道回调相当于一个“块”,但有一个指向“promise”的箭头符号意味着什么?

  • 回调 用户在支付完成后跳转回来的页面,一般只建议做显示用途。 // SDK实例化,传入公共配置 $pay = new \Yurun\PaySDK\AlipayApp\SDK($params); if($pay->verifyCallback($_GET)) { // 回调验证成功,可以通过GET参数来获取支付宝回传的参数 } else { // 回调验证失败 } 详见:test