2016-07-18 16 views
1

私はAngularJSアプリケーションを構築しています。アプリケーションのバックオフィスでは、ユーザー/アカウントの種類(管理者、プレミアム、無料)に応じて、ユーザーは異なるアクセス許可(2種類)を持ちます。Angularjs権限ユーザのタイプ

  1. 制限区域(例:サイドバー)が表示されますが、ユーザーがリンクのいずれかをクリックすると、それは「プレミアムを購入版」のような何かを言うモーダルを開きます。
  2. 制限区域は見えません。

私は、要素に適用されるサービスとディレクティブの組み合わせを使用することを考えていますが、後で展開できる機能が欲しいので、実際には最良の方法はありません。

私は、誰かが私の目標を達成する方法について私に助言を与えることができることを願っています。

ダッシュボードのレイアウト例: enter image description here

答えて

2

私はあなたがサービスやコントローラのどこかに保存されたユーザデータを持っていると仮定します。私は単純にそこに追加のディレクティブを作成するためにng-if

<restricted-content ng-if="vc.user.isPremium"> 

必要がありませんを使用して、すべての可視性をドライブしたいです。

サイドバーコンテンツについては、あなたはディレクティブルートを行けば、私は次の持つディレクティブで何かをすることをお勧めしたい:

  • リッスン要素のclickイベントのデフォルト以外

    • 高いディレクティブの優先順位となる:
      • ユーザーの権限がチェックアウトする場合は何も、そしてそれ以外
      • コールevent.preventDefault()event.stopImmediatePropagation()
      • は、あなたの「プレミアムに申し込む」モーダル
      • を起動するサービスを使用しないでください

    擬似コード:

    .directive('premiumContent', [ 
        'popupService', 
        'sessionService', 
        function(popupService, sessionService){ 
    
          return { 
           restrict: 'A', 
           priority: -1, 
           link: function($scope, elem, attrs){ 
    
            elem.on('click', function(evt){ 
             if (!sessionService.user.isPremium) 
             { 
              evt.preventDefault() 
              evt.stopImmediatePropagation() 
    
              $scope.$apply(function(){ 
                popupService.show(...) 
              }) 
             } 
            } 
           } 
          } 
        } 
    ]) 
    

    実装:ここ

    <sidebar-content-item ng-click="vc.contentClick()" premium-content> 
    

    は、例えば(CoffeeScriptの+玉)である - http://codepen.io/jusopi/pen/qNooZj?editors=1010

  • +0

    あなたのコメントのための最初のおかげです、私はちょうど問題があり、ng-Ifに関して、基本的に私は私のコントローラのユーザー情報に関するデータを保存するサービスを作りました。ユーザーisPremiumは、サービスから、しかし、私は問題がある、それはページの他の要素が既にロードされ、表示されるときに、空白のようになる、ページが読み込まれるサイドバーが表示されます。いくつかの時間の後にサイドバー、私は感じている、私のコードの例です - http://pastebin.com/u8Wn4VZd –

    +0

    ほとんどのアプリはUIを表示する前に、事前チェックを持って、それは私が取るだろうルートです。すべての必要な情報を前面に表示し、次にUIの表示方法を示します。 https://github.com/angular-ui/ui-routerを使用している場合、各状態には 'resolve'プロパティがあり、テンプレートがロードされる前に問題が解決されていることを確認できます。 – jusopi

    +0

    ありがとう、最後の1つの質問、私は、ディレクティブを実装しましたが、 'code'evt.preventDefault() evt.stopImmediatePropagation();' code'、これは動作していない可能性がありますngClickを使用して作成されています。 –

    1

    一つのアプローチは、currentUserサービスを定義することですあなたのアプリケーション内の現在のユーザーの情報を保持するユーザーがこのサービスにログインしていないときにisAnonymous()のようなメソッドがあり、ユーザーがアプリケーションにログインしていない場合はtrueが返されます。isPremiumまたはisAdminのようなプロパティもあります。currentUserを表示すると、アプリケーションにログインしているユーザーの状態に応じて、ビューの任意の部分を簡単にフィルタリングできます。

    また、linkには、認証/認証に対処するためのきれいな方法が紹介されています。

    希望すると助かります!

    関連する問題