我是angularjs和firebase的新手。我试图创建一个用户插入用户名的表单。每次<input>
更改时,我都会检查用户名是否已被占用或是免费的。如果已经使用了用户名,我想显示一个<p>
,其中显示&#34;用户名已经被取消&#34;。
问题是这个:如果我插入已经使用的用户名(例如&#34; Damiano &#34;),控制台会说&#34;用户名不正常&#34;但是没有出现带有ng-show的<p>
段落。但是,如果我在用户名中添加一个字母(例如&#34; Damianox &#34;),控制台会说&#34;用户名是好的&#34;并出现<p>
段!但它的出现是因为用户名&#34; Damianox&#34;免费!
似乎有一封信的延迟!
这是代码,对不好的英语抱歉!
这是fistime.html
<!-- Text input-->
<div class="form-group">
<label class="col-md-4 control-label" for="txtTitle">Username</label>
<div class="col-md-4">
<input type="text" id="txtUsername" ng-model="user.username" ng-change="verifyuser();" placeholder="Be imaginative" class="form-control input-md">
<p ng-show="invalidUsername"> The username is already taken</p>
</div>
</div>
这是firstime.js
.controller('FirstimeCtrl', ['$scope', '$firebase','$location', 'CommonProp', function($scope, $firebase, $location ,CommonProp) {
$scope.verifyuser = function(){
//var invalidName = $scope.invalidUsername;
var newUsername = $scope.user.username;
var msg = $scope.invalidMsg;
var ref = new Firebase("https://instafame.firebaseio.com");
var q = ref.child("users").orderByChild("username").equalTo(newUsername);
q.once("value", function(snapshot){
if (snapshot.val() === null){
$scope.invalidUsername = false;
console.log("the username is ok")
}else{
$scope.invalidUsername = true;
console.log("the username is not ok")
}
})}
提前致谢&lt; 3
答案 0 :(得分:1)
请勿在输入中使用ng-change
。如果内存服务,则从ng-model
到模型的更改发生在与ng-change
处理程序不同的摘要周期。
不使用ng-change
,而是在模型上使用$watch
。将其添加到您的控制器,然后删除ng-change
attrbute:
$scope.$watch('user', $scope.verifyUser, true);
true
可以执行“深度监视”,因此当user
的任何属性或子属性发生更改时,它会触发。处理函数还将接收新值和旧值作为参数。
在此处详细了解$watch
:
scope.$watch
答案 1 :(得分:0)
这里的问题是,invalidUsername
的更改不会触发您的新摘要圈。
您可以使用$timeout
解决此问题。
注入$timeout
后,您可以更改代码(我在此处简化了if / else案例):
q.once("value", function(snapshot){
$timeout(function(){
$scope.invalidUsername = snapshot.val() === null;
});
})}