概述:
我使用一个观察者事件$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;
});
它确实是早期angularfire 0.6.0中的一个错误。
angularfire 0.7.0不再存在问题
向传递给$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