2017-01-12 61 views
0

我想要開始使用Angular(1),我有一個佈局,其中的nav需要根據登錄的用戶類型進行更改,當頁面加載時我發送向用戶對象發送對API的請求(我將與頁面上的其他控制器共享)。構建基於ajax響應的角度視圖

這是我的控制器,到目前爲止,

app.controller('DashboardController', function($scope, UserService, $rootScope){ 
     $scope.loading = true; 

     if($scope.loading) { 
      $scope.doInitialisation 
     } 

     $scope.isSuper = function() { 
      if($scope.user.isSuper == 1) { 
       return true; 
      } 

      return false; 
     } 

     UserService.authenticatedUser() 
      .then(function(response){ 
       $scope.loading = false; 
       $rootScope.user = response.message; 
      }, function(error) { 
       $scope.hasError = true; 
       $scope.errors = error.message; 
      }); 
    }); 

在我的模板我做一些喜歡嘗試並展示基於用戶類型的UL,

<ul ng-if="isSuper()" ng-include="dashboard/nav/super.html"id="sidebar-menu" class="sf-js-enabled sf-arrows"> 

</ul><!-- #sidebar-menu --> 

我碰到下面的錯誤,

無法讀取的未定義的屬性 'isSuper'

我認爲這是因爲isSuper()在我的ajax加載之前被解僱,有沒有辦法繞過我們?我可以在ajax成功回調模板中做我正在做的事情嗎?

完全有更好的方法嗎?

+0

您使用路由ng-include指令,如果是的話,你可以將確保依賴性加載控制器代碼被執行之前,請參閱HTTP的路線上使用的resolve屬性? //odetocode.com/blogs/scott/archive/2014/05/20/using-resolve-in-angularjs-routes.aspx –

+0

將$ scope.user初始化爲新的空白JavaScript對象,另一種方法是將它留給AngularJS它會在ng-if指令的表達式更改(true或false)時檢查我的示例代碼片段來更新視圖。 –

回答

0

下面的代碼片段演示了數據何時異步到達Angular將通過其數據綁定更新視圖,以使用ng-if指令顯示html元素。 Plunker例如使用

angular 
 
    .module('demo', []) 
 
    .controller('DefaultController', DefaultController); 
 

 
DefaultController.$inject = ['$timeout']; 
 

 

 
function DefaultController($timeout) { 
 
    var vm = this; 
 
    vm.user = {}; 
 

 
    $timeout(function() { 
 
    vm.user.role = 'admin'; 
 
    }, 1000); 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script> 
 
<div ng-app="demo"> 
 
    <div ng-controller="DefaultController as vm"> 
 
    <div ng-if="vm.user.role === 'admin'"> 
 
     <span>Hello, Admin</span> 
 
    </div> 
 
    </div> 
 
</div>