当前位置: 首页 > 知识库问答 >
问题:

angularFire的$bind方法的副作用?

邹举
2023-03-14

概述:

我使用一个观察者事件$on$fire base SimpleLogin来触发一个查询,然后使用一个函数来设置当前登录的用户。

它工作得很好,但只要我调用$firebase的$bind方法,它就会一直返回undefined,即使authUser。uid正确且相同。

 $rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid));
    query.$on('loaded', function () {
      setCurrentUser(query.$getIndex()[0]);
    });
  });

在调用$bind之前,

AuthUser.uid返回simpleLogin: 26
查询结果有一个对象a24
查询。$getIndex()[0]返回a24

调用$bind后,

authUser。uid返回simpleLogin:26查询结果没有对象查询$getIndex()[0]返回未定义的

当传入的参数相同(simpleLogin:26)时,为什么查询在调用$bind后不返回任何内容?

问题似乎只有在我通过3路绑定更改远程数据中的某些内容后才会出现。

firebase
|
|--users
   |
   |--a24
   |   |
   |   |--username: a24
   |   |--md5_hash: "..."
   |   |--name: alice
   |
   |--cate
   |   |
   |   |--username: a25
   |   |--md5_hash: "..."
   |   |--name: cate 

authUser对象两次返回相同的对象:

Object {provider: "password", id: "27", uid: "simplelogin:27", email: "a24@a24.com", md5_hash: "b20aaf7e9c4d7123f788eb45ac7fd91a"…}
email: "a24@a24.com"
firebaseAuthToken: "eyJ0eXAiOiJKV1QiLCJh..."
id: "27"
isTemporaryPassword: false
md5_hash: "b20aaf7e9c4d7123f788eb45ac7fd91a"
provider: "password"
uid: "simplelogin:27"
__proto__: Object
'use strict';

app.controller('ProfileEditCtrl',
  function($scope, $routeParams, User, $firebase, FIREBASE_URL, $location){
    $scope.user = User.findByUsername($routeParams.username );
    $scope.user.$bind($scope, 'boundUser' );
  });
  <!--Profile Pane-->
  <div class="tab-pane active" id="profile" >
    <form class="form-horizontal" action="">
      <div class="control-group"><label class="control-label" for="name">Name</label>
        <div class="controls">
          <input id="name" type="text" data-ng-model="boundUser.fullname" placeholder="Name"/>
        </div>
      </div>
      <div class="control-group"><label class="control-label" for="email">Cafe Name</label>
        <div class="controls">
          <input id="email" type="text" data-ng-model="boundUser.cafename" placeholder="Cafe Name"/>
        </div>
      </div>
      <div class="control-group">
        <div class="controls"><a href="#/users/{{currentUser.username}}">Save</a></div>
      </div>
    </form>
  </div>
'use strict';

app.factory('User', function ($firebase, FIREBASE_URL, $rootScope/*, Auth*/) {
  var ref = new Firebase(FIREBASE_URL + 'users');

  var users = $firebase(ref);

  var User = {
    create: function (authUser, username) {
      /* jshint camelcase: false */
      users[username] = {
        md5_hash: authUser.md5_hash,
        username: username,
        $priority: authUser.uid
      };

      users.$save(username).then(function () {
        setCurrentUser(username);
      });
    },
    findByUsername: function (username) {
      if (username) {
        return users.$child(username);
      }
    },
    getCurrent: function () {
      return $rootScope.currentUser;
    },
    signedIn: function () {
      return $rootScope.currentUser !== undefined;
    }
  };

  function setCurrentUser (username) {
    $rootScope.currentUser = User.findByUsername(username);
  }

  $rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
    var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid));
    query.$on('loaded', function () {
      setCurrentUser(query.$getIndex()[0]);
    });
  });

  $rootScope.$on('$firebaseSimpleLogin:Logout', function () {
    delete $rootScope.currentUser;
  });

  return User;
});

共有2个答案

袁志专
2023-03-14

它确实是早期angularfire 0.6.0中的一个错误。

angularfire 0.7.0不再存在问题

谢昂雄
2023-03-14

向传递给$on事件的函数添加参数。它会有你的身份证。

query.$on('loaded', function(uid) { ... });

或者引用绑定的variabke:$范围。边界用户

这样地:

$rootScope.$on('$firebaseSimpleLogin:login', function (e, authUser) {
var query = $firebase(ref.startAt(authUser.uid).endAt(authUser.uid));

query.$on('loaded', function (data) {
    setCurrentUser(data[0]);
  });

我无法理解您为什么要绑定用户变量的逻辑。用户通常不会改变太多。此外,您是在不是单例的控制器中进行的。因此,每次再次呈现视图时,您的代码都会运行,指向不需要绑定。如果需要向用户通知控制器异步更改,请查看角$广播并创建您自己的事件以在控制器中监听。

好啊所以我会采取不同的方法。在登录事件上:

 ref = <your.firebase.url>+'/users/+'authUser.uid
 var query = $firebase(ref)
 query.$on('loaded', function(userData) {
    setCurrentUser(userData);
 });

我不确定我是否完全理解您的问题,但这将填充数据并且数据将是双向绑定的。意思是,如果服务器的任何数据在您完成此查询后发生变化,那么数据将在您的User对象中发生变化。只要您不复制数据并因此取消引用它。希望这有帮助。

 类似资料:
  • 本文向大家介绍jQuery的bind()方法使用详解,包括了jQuery的bind()方法使用详解的使用技巧和注意事项,需要的朋友参考一下 bind()方法用法详解: 此方法是使用比较频繁的方法之一,虽然在API手册上有着对方法的介绍,但是由于语言简短,例子不够详细,可能会造成不能够完全准确的掌握bind()方法的使用,下面就结合实例介绍一下此方法的使用。 语法格式: 此方法可以为所有匹配元素的特

  • 它不再工作,并抛出一个错误:无法读取未定义的属性'num'。 有人能解释一下为什么不再起作用了吗?

  • 我已经使用RxJava编写了一个存储库,但在找到处理对repo的写入和删除的最佳方法时遇到了麻烦。 我找到了2个潜在的解决方案,但不确定它们的正确程度: 1)使用启动一个observable,然后使用副作用方法调用存储库的方法。这是可行的,看起来很奇怪,但它允许我使用RxJava,并允许我指定要订阅的线程/要观察的线程,这使得线程处理变得容易,并且允许存储库的API保持不变,这样它仍然返回void

  • 本文向大家介绍说说bind、call、apply的区别?并手写实现一个bind的方法相关面试题,主要包含被问及说说bind、call、apply的区别?并手写实现一个bind的方法时的应答技巧和注意事项,需要的朋友参考一下 和都是为了解决改变的指向。作用都是相同的,只是传参的方式不同。 除了第一个参数外,可以接收一个参数列表,只接受一个参数数组。 绑定完之后返回一个新的函数,不执行。

  • 本文向大家介绍在JavaScript中正确引用bind方法的应用,包括了在JavaScript中正确引用bind方法的应用的使用技巧和注意事项,需要的朋友参考一下  在JavaScript中,方法往往涉及到上下文,也就是this,因此往往不能直接引用,就拿最常见的console.log("info…")来说,避免书写冗长的console,直接用log("info…")代替,不假思索的会想到如下语法

  • AngularFire 是 Firebase 官方支持 AngularJS 绑定 Firebase。Firebase 是全后端,不需要服务器就可以构建你的 Angular 应用。AngularFire 提供 $firebase 服务,允许你简单的保持 $scope 和 Firebase 后端变量同步。 AngularFire是Firebase核心客户端的补充。它提供了几种Angular服务: $f