10

ユーザー権限を評価するディレクティブを作成しようとしています。

ユーザーが特定のコンテンツの閲覧を許可されていない場合

  1. コンテンツは表示されません(完了、正常に動作しています)

  2. パーミッション ディレクティブ内のコントローラーからのリクエストは発生しません。

例:

コントローラ:

function MyController ($scope){
     // performing imediately server request, witch is allowed only for admin
     // therefore i will get error when non admin user access this page
}

パーミッション ディレクティブ:

return {
        priority: 1000,
        restrict: 'E',
        link: (scope, element, attrs) => {
            var permission = attrs.permission;

            if (/*evaluating permission*/) { 
                // user has permission, no work for me
                return;
            }

            element.remove();
        }
    };

すべて一緒に:

<permission permission="isAdmin">
    <div ng-controller="MyController">
    </div>
</permission>

このバージョンは DOM から要素を削除していますが、MyController のリクエストは引き続き実行されます。もちろん、MyController でアクセス許可を確認できますが、そうしたくありません。

助けてくれてありがとう。

4

3 に答える 3

2

問題は、リンク関数が実行される前にコントローラーが常に呼び出されることです。このフィドルを参照してください。

function MyCtrl($scope) {
    console.log('in controller');
}

myApp.directive('permission', function() {
    return {
        restrict: 'E',
        link: function(scope, element, attrs) {
            console.log('in link');

ログは次のことを示しています。

in controller
in link
于 2013-03-12T14:42:26.880 に答える
1

別のアプローチを試し、要素の削除をコンパイル関数に入れました。ログによるとBEFOREコントローラで実行されているので、ちょうどいいところです。とにかく、リクエストはまだ発行されました。だから私はブラインドショットとして要素の子を削除しようとしました(私は知っています、それは意味がありません。要素の削除で十分であり、子も削除する必要があります)。

しかし、うまくいきました!

compile: function(element) { var children = element.children(); children.remove(); element.remove(); }

動作していますが、どの程度 OK かはわかりません (たとえば、将来のバージョンの Ang.)。

于 2013-04-22T06:47:09.383 に答える
-1

私があなたなら、サーバーに電話して、アクセスが許可されているかどうかを確認します。

ディレクティブでこれを行うことは、実際には意味がありません。

ディレクティブは一般に dom を操作するためのものであり、これは承認確認であり、通常はコントローラーで処理され、その結果がイベントをトリガーする必要があります。

次に、ディレクティブにそのイベントをリッスンさせ、サーバーからアクセスした場合は dom を操作します。

そうしないと、誰でも簡単に好きなものを挿入して、管理パネルを見ることができます。

意味がわからない場合は、必要に応じて回答を拡大できることをお知らせください。

于 2013-03-12T14:39:27.327 に答える