2015-05-30 91 views
0

我为我的角度应用程序有一个非常简单的js文件。AngularJS函数被调用很多次?

angular.module('Account', ['firebase']) 

    .value('fbURL', 'https://myURL.firebaseio.com/') 

    .service('fbRef', function(fbURL) { 
    return new Firebase(fbURL) 
    }) 

    .controller('Authorization', function($scope, $firebase, $firebaseObject, fbRef){ 

     var auth = this; 

     auth.loginEnabled = function() { 

     alert('false'); 

     return false; 
     } 

     auth.loginEmail = function() { 


     } 

    }); 

当我的html加载时,auth.loginEnabled函数被多次调用(警告出现很多次)。为什么是这样?

在我的HTML

  • NG-应用程序是在我的HTML标签声明为NG-应用= “帐户”
  • NG-控制器在我的<div class="container"> delcared一个包装了如果用于角度
  • ng-if被声明了两次,一次是真正的返回,一次是假的。

总之,这里是我的html代码:(您所有的缺失是上述NG-应用程序代码)

<div class="container login-container" ng-controller="Authorization as auth"> 
      <div class="row"> 
       <div class="col-sm-12"> 
        <form class="" action="" method=""> 
         <div class="card-container manual-flip"> 
          <div class="card"> 
           <div class="front"> 
            <div class="cover"> 
             <img src="<?php echo $base; ?>assets/img/rotating_card_thumb2.png"/> 
            </div> 
            <div class="content" ng-if="auth.loginEnabled()"> 
             <div class="main"> 
              <h3 class="name">Login</h3> 
              <p class="profession">My Account</p> 
              <div class="form-group"> 
               <input type="email" ng-model="email" class="form-control" placeholder="E-mail Address"> 
              </div> 
              <div class="form-group"> 
               <input type="password" ng-model="password" class="form-control" placeholder="Password"> 
              </div> 
             </div> 
             <div class="footer"> 
              <button type="submit" class="btn btn-block btn-primary">Login <i class="fa fa-arrow-right"></i></button> 
             </div> 
            </div> 
            <div class="content" ng-if="!auth.loginEnabled()"> 
             <div class="main"> 
              <h3 class="name">Login</h3> 
              <p class="profession">Temporarily Unavailable</p> 
              <p class="text-center">We are currently updating our system for a better user experience! Please check back within a few hours.</p> 
             </div> 
             <div class="footer"> 
              <a href="<?php echo $base; ?>" class="btn btn-block btn-primary"><i class="fa fa-reply"></i> Return Home</a> 
             </div> 
            </div> 
            <div class="back"> 

            </div> 
           </div> 
          </div> 
         </div> 
        </form> 
       </div> 
      </div> 
     </div> 

我想在特定的时间都在一起禁用登录功能,不知道用户是否已经登录。

+0

的可能重复的[角范围功能执行多次(http://stackoverflow.com/questions/17164230/角度范围函数执行多次) –

+0

建议避免不需要的函数,使用“LoginAuthenticated”布尔变量来显示用户状态,这不会导致角度重新运行监视器监听器。 –

+0

好吧....虽然没有帮助我。我将如何解决它? – moevans

回答

1

正如Orel提到的,重复警报的原因很简单,就是在每个摘要循环中调用您的函数loginEnabled。没有太多细节,Angular经常重新评估绑定到范围的那些函数和值,以确保您的UI准确地表示您的数据。

因此,将优选分配loginEnabled值为布尔和查询的范围之内:

auth.loginEnabled = false; 

$rootScope.$on('myAuthenticationEvent', function() { 
    auth.loginEnabled = true; 
}); 

的$ rootScope的使用不是必要的,而是用来说明,其他一些您的控制器(可能是Firebase观察员)可能会负责更新您的auth.loginEnabled值。希望这可以帮助!

+0

我刚刚得到更多的错误。正在$ rootScope未定义。我以为Angular应该很容易! – moevans

+0

当页面加载时,我只想检查我的firebase数据库并查看管理员是否已禁用或启用了该站点的登录功能。如果登录功能被禁用,登录表单将被隐藏。如果启用,它将显示登录表单。这就是我想要做的。 – moevans

+0

如果您想使用我的示例的那部分,请记住注入$ rootScope。 –

0

的原因是,你的控制器被调用了两次,可能是因为这个

ng-controller="Authorization as auth在视图中被提及,并在配置你的路线,你可能还包括控制器有太多。像下面

    url: '/your url', 
       config: { 
        templateUrl: 'url', 
        controllerUrl: 'url', 
        controller:'Authorization' 
       } 

如果是这样的话,那么,你的代码变更为

    url: '/your url', 
       config: { 
        templateUrl: 'url', 
        controllerUrl: 'url', 
       }