2014-05-15 65 views
0

我是Angular的新手,但它似乎是儘可能避免DOM操作的「角度方式」。我不確定我是否採取了正確的方法。根據服務變量更改CSS

我在底部有三個按鈕(next,back和home)。這些通過其他控制器的動作獲得啓用和禁用。例如,如果文本框爲NULL,則在輸入內容之前下一個按鈕將被禁用。我有以下幾點:

<div ng-controller="nextBackController" class="navbar navbar-app navbar-absolute-bottom"> 
     <div class="btn-group justified"> 
      <a href="#/" class="btn btn-navbar btn-icon-only btn-bounded"><i class="fa fa-arrow-left fa-navbar" ng-class="{'btn-disabled' : btnBack}"></i> Back</a> 
      <a id="btnHome" ng-click="handleClick()" href="#/" class="btn btn-navbar btn-icon-only btn-bounded" ng-class="{'btn-disabled' : btnHome}"><i class="fa fa-home fa-navbar"></i> Home</a> 
      <a href="#/second" class="btn btn-navbar btn-icon-only">Next <i class="fa fa-arrow-right fa-navbar" ng-class="{'btn-disabled' : btnNext}"></i></a> 
     </div> 
    </div> 

現在的JS:

app.service("nxtBackClick", function($rootScope, bottomButtonWatcher) { 

    this.btn = ""; 

    this.broadcast = function(btn) { 
     //Toggle the Next button as an example 
     bottomButtonWatcher.btnNext = ~bottomButtonWatcher.btnNext; 

     //set the btn that is clicked 
     this.btn = btn; 
     $rootScope.$broadcast('bottomBtnClick'); 
    }; 
}); 

app.service("bottomButtonWatcher", function($rootScope) { 

    //Set all these to disabled 
    this.btnHome = true; 
    this.btnNext = false; 
    this.btnBack = true; 

}); 

而現在的控制器:

//####################### - Next Back Controller ######################## 
app.controller("nextBackController", 
    function($scope, nxtBackClick, bottomButtonWatcher){ 

     $scope.btnHome = bottomButtonWatcher.btnHome; 
     $scope.btnNext = bottomButtonWatcher.btnNext; 
     $scope.btnBack = bottomButtonWatcher.btnBack; 

     $scope.handleClick = function(btn) { 
      nxtBackClick.broadcast(btn); 
     }; 
    } 

); 
+0

究竟什麼是您的問題 - 是這段代碼不工作? 「Angular Way」並不特別阻止DOM操作,但更喜歡通過使用指令來完成。 –

+0

當我更新bottomButtonWatcher.btnNext時,我不認爲$ scope.btnNext也在更新,從而觸發CSS更改 – user3641212

回答

0

同時具有class屬性和NG-class屬性可以有問題的。它們都應該被壓縮成一個ng類的屬性。您已經傳遞了一個對象,所以只需添加其他屬性即可。將類設置爲始終顯示是通過將其屬性設置爲true來完成的。 。

<div ng-controller="nextBackController" class="navbar navbar-app navbar-absolute-bottom"> 
    <div class="btn-group justified"> 
     <a href="#/" class="btn btn-navbar btn-icon-only btn-bounded"> 
     <i ng-class="{'fa fa-arrow-left fa-navbar': true, 'btn-disabled' : btnBack}"></i>  
     Back 
     </a> 
     <a id="btnHome" ng-click="handleClick()" href="#/" ng-class="{'btn btn-navbar btn-icon-only btn-bounded':true, 'btn-disabled' : btnHome}"> 
     <i class="fa fa-home fa-navbar"></i> 
     Home 
     </a> 
     <a href="#/second" class="btn btn-navbar btn-icon-only"> 
     Next 
     <i class="" ng-class="{'fa fa-arrow-right fa-navbar':true, 'btn-disabled' : btnNext}"></i> 
     </a> 
    </div> 
</div> 
0

您使用$ rootScope $廣播,但沒有人在聽,你需要在你的控制器範圍觀察家實際控制按鈕:

//####################### - Next Back Controller ######################## 
app.controller("nextBackController", 
    function($scope, nxtBackClick, bottomButtonWatcher){ 

     $scope.btnHome = bottomButtonWatcher.btnHome; 
     $scope.btnNext = bottomButtonWatcher.btnNext; 
     $scope.btnBack = bottomButtonWatcher.btnBack; 

     $scope.handleClick = function(btn) { 
      nxtBackClick.broadcast(btn); 
     }; 

     $scope.$watch('bottomBtnClick', function(buttonVal){ 
      $scope[buttonVal] = true; 
     }); 
    } 

); 
+0

bottomBtnClick廣播事件在另一個控制器中進行監視(因爲每個控制器在「下一個」被點擊)。我只是想監視bottomButtonWatcher.btnNext變量,並適當地更改$ scope.btnNext變量 – user3641212

+0

我想我的觀點是,如果你只是在控制器中實現一個監視器,你不需要有一個服務來維護這些變量你的底部按鈕。合理? –