2015-05-30 94 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', 
       }