2013-10-27 2 views
40

ユーザーの役割が変更されるたびにメニューをリロードする必要がある状況がアプリケーション内にあります(1人のユーザーが複数の企業で役割を果たすことがあります)。

私はこの問題にアプローチする最善の方法を知りました。

は、現在、私は次のことをやっている:役割がロードを完了したら

app.controller('menuLoadingCtrl', function($location, $scope, authService){ 
    $scope.model.initialRole = authService.getRole(); 
    $scope.$watch(function(){return authService.getRole()}, function(val){ 
     if(val && val != $scope.model.initialRole){ 
       $scope.layout.menuSrc = 'partials/menu.html'; 
     } 
    }); 
}) 
シンプル

は背面メニュービューへ、そしてそこから、メニューのロードビューにユーザーをリダイレクトします。 私は、この機能に包まれています:私はどのシナリオで呼び出す

$scope.layout.reloadMenu = function(){ 
     $scope.layout.menuSrc = 'partials/menuLoading.html'; 
    } 

はで私がメニューをリロードしたいと思います。

$ rootScopeのサービスからこのイベントをブロードキャストし、コントローラでそれを聴くことで、このプロセスをより自動化できるかどうか疑問に思っていました。

これについてのご意見やアドバイスをいただければ幸いです。

答えて

52

$watch()汚れチェックしています:この機能は各ダイジェストサイクルを比較します。一方、$broadcast()はイベントが1つしかない場合にのみ伝搬します。当然、$broadcast()$watch()よりも安いです。

しかし、実際にここでパフォーマンスを心配する必要はありましたか?サイクルごとの1つの基本的な比較は何もありません。しかし、概念的には、$watch()は明らかに必要なものです:の都度、のアクションを実行する必要があります。私はここで$broadcast()を使用して想像することはできません。

+5

+1明確で簡潔です。私はちょうどそのOPのコードは、最初の場所でコントローラで '$ウォッチ'または '$放送'を持ってはいけないことを追加したいと思います - むしろOPは角度サービスまたはより良いまだ '$ q'で' authService'をラップする必要があります約束する。 –

+0

すぐにお返事ありがとうございます。 私はそれが正しい道だと思うが、唯一の問題は、コードを大量にしてメンテナンスを増やすためにメニューをリロードするたびに特定の関数を呼び出す必要があるということだけだ。 サービスレベルの汚れチェックを行い、均一性をブロードキャストすると自動的にこの処理が行われますが、サーバーへの要求が解決されている間はローダーを表示することはできません。 –

+0

また、ログインタイプ/ログアウトなど、ロールタイプを同期して設定する場合のコントローラのフラグを設定する必要があります。 –

関連する問題