【问题标题】:Why does my Angular's ng-show call only get updated on the second click using Firebase?为什么我的 Angular 的 ng-show 调用只会在使用 Firebase 的第二次点击时更新?
【发布时间】:2017-01-29 00:25:05
【问题描述】:

我正在使用 AngularJS 和 Firebase 制作登录页面。到目前为止,我的大部分代码都运行良好,直到我尝试添加通知。当 ng-show 说应该显示时,似乎不会显示。需要两次点击才能工作,这绝不应该是这种情况。 截至目前,我有以下按钮。

    <button ng-click="cna()" type="button" class="btn btn-success ban block" style="width:50%">Create New Account</button>

cna() 函数是创建新帐户函数。这看起来像:

    create($scope.email, $scope.password);

create() 方法如下所示:

    function create(email, password) {
        firebase.auth().createUserWithEmailAndPassword(email,password).catch(function(error){
            var errorCode = error.code;
            var errorMessage = error.message;
            console.log(errorCode+":"+errorMessage);
            $scope.failure = true;
            $scope.success = false;
        });
        firebase.auth().onAuthStateChanged(function(user){
            if(user){
                $scope.success = true;
                $scope.failure = false;                
            }else{}
        });
     }

最后,我有两个通知应该在 $scope.success 或 $scope.failure 设置为 true 时显示。但是,这只适用于第二次点击,它应该会失败。所以,我的问题是我的帐户正在创建中,但是直到第二次单击才通知我的 GUI。根本不需要第二次点击就可以工作。

最后,我的通知代码如下:

    <div class="alert alert-success" ng-show="success"><strong>Success!</strong> You made an account!</div>

    <div class="alert alert-danger" ng-show="failure"><strong>Sorry!</strong> This user already exists...</div>

我浏览了整个网络,到目前为止,我发现的只是一个叫做 AngularFire 的东西,它可能是一个不错的选择,但我不确定。如果有人能帮我解决我的问题,我将不胜感激!

【问题讨论】:

  • 开始放一些 console.logs() 在那里。我向您保证 ng-show 正在按预期工作,并且您的代码不起作用
  • 除非您使用 angularFire...您正在更新 Angular 上下文之外的范围,并且需要使用 $apply() 告诉 Angular 运行摘要

标签: angularjs firebase firebase-authentication


【解决方案1】:

如果您在第一次点击后没有看到任何消息(是吗?),请尝试将成功功能添加到您的承诺中:

function create(email, password) {
    firebase.auth().createUserWithEmailAndPassword(email,password).then(function () {
      // you may want to add some condition here
      $scope.success = true;
    }, function(error){
        var errorCode = error.code;
        var errorMessage = error.message;
        console.log(errorCode+":"+errorMessage);
        $scope.failure = true;
    });
    firebase.auth().onAuthStateChanged(function(user){
        if(user){
            $scope.success = true;
            $scope.failure = false;                
        }else{}
    });
 }

【讨论】:

    【解决方案2】:

    如果您在回调函数中更新范围,AngularJS 不会意识到该更新。这意味着它不会更新视图。因此,当数据更新时,视图不会。这也是为什么当您再次单击(或以其他方式强制刷新视图)时,数据会显示出来的原因。

    解决方案是通过调用$timeout() 或$apply() 来明确告诉AngularJS 它需要刷新视图。

    function create(email, password) {
        firebase.auth().createUserWithEmailAndPassword(email,password).catch(function(error){ $timeout(function() {
            var errorCode = error.code;
            var errorMessage = error.message;
            console.log(errorCode+":"+errorMessage);
            $scope.failure = true;
            $scope.success = false;
        })});
        firebase.auth().onAuthStateChanged(function(user){
            if(user){ 
              $timeout(function() {
                $scope.success = true;
                $scope.failure = false;                
              });
            }else{}
        });
     }
    

    如果您使用标准绑定库:AngularFire,很多此类情况都会自动处理。

    【讨论】:

    • 这绝对正确(你得到了我的支持 :)),这是更通用的方法,如果用户未登录,我会添加更改标志的切换。在 else 块。 (据我了解 createUserWithEmailAndPassword().catch 只会被触发一次)
    猜你喜欢
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2015-03-14
    • 1970-01-01
    相关资源
    最近更新 更多