0

DOM要素を表示する権限がない場合、DOM要素を破棄するためのディレクティブを作成しようとしました。 I次のようにこれを行う:rootScopeから取られ、現在のユーザーがそれの許可の間で許可「manage_appointments」を持っていない場合、このdivがなければなりません。この状況では角度カスタムディレクティブで値が定義されていません

<div class="col-xs-12 col-md-9" ng-permission="manage_appointments"></div> 

例えば:

angular 
     .module('digital_equation.auth') 
     .controller('AuthLoginController', AuthLoginController) 
     .directive('ngPermission', ngPermissionDirective); 

function ngPermissionDirective() { 
    return { 
     multiElement: true, 
     scope: { 
      ngPermission: '@' 
     }, 
     restrict: 'A', 
     link: function (scope, element, attributes) { 
      scope.$watch('ngPermission', function (value) { 
       console.log(value); 
       //Access rootScope to get the current user permissions 
       var permissions = scope.$root.globals.currentUser.role.settings.permissions; 
       //Loop through permissions object to check if any permission is the same as the value sent to directive 
       var keepGoing = true; 
       angular.forEach(permissions, function (permission, key) { 
        if (keepGoing == true) 
        { 
         if (key == value) { 
          element.show(); 
          keepGoing = false; 
         } 
         else { 
          element.hide(); 
         } 
        } 
       }); 
      }) 
     } 
    }; 
} 

は、HTML破壊されました。あなたが見ることができるように、私はそれを隠す方法しか知りませんが、これでは十分ではありません。ページにこのdivが表示されないようにするために、それを破壊する必要があります。 私の2番目の問題は、console.log(value);が私が何を試しても関係なくundefinedを返すということです。 また、rootScopeにアクセスする際にもアドバイスが必要です。ここでパラメータとしてrootScopeを渡すと動作しますが、スコープも渡すことはできません。どうすればこのようにすることができますか?

link: function(rootScope, element, attributes) 

私はauthControllerで私のディレクティブを宣言していても、私はそれが私のプロジェクト全体で利用できるようにする必要がありますのでご注意ください。 申し訳ありませんが、AngularJsの私の最初のカスタムディレクティブです。私は多くのオプションを試しました。 お時間をいただきありがとうございました!

編集:

scope.$watch('ngPermission', function (value) 

これは、値が未定義であることと私の問題を解決したが、私は2つの異なる要素(非表示にするための1と示される1)にディレクティブを使用しようとすると、それがどんな最後を行います私の指示の使用が適用されます(この場合は両方とも表示されます)。これがどうして起こるのか?

ソリューション:

function ngPermissionDirective() { 
    return { 
     multiElement: true, 
     priority: 900, 
     scope: { 
      ngPermission: '@' 
     }, 
     restrict: 'A', 
     link: function (scope, element, attributes) { 
      scope.$watch('ngPermission', function (value) { 
       console.log(value); 
       //Access rootScope to get the current user permissions 
       var permissions = scope.$root.globals.currentUser.role.settings.permissions; 
       //Loop through permissions object to check if any permission is the same as the value sent to directive 
       var keepGoing = true; 
       angular.forEach(permissions, function (permission, key) { 
        if (keepGoing == true) 
        { 
         if (key == value) { 
          element.show(); 
          keepGoing = false; 
         } 
         else { 
          element.remove(); 
         } 
        } 
       }); 
      }) 
     } 
    }; 
} 
+0

たぶんbacause '@' 'してみてくださいngPermissionの: '='' – Leguest

+0

まず、あなたが見ているattribute.yourValuesを、あなたは、スコープを監視する必要があります。したがって: 'scope.ngPermission'。バインディングとウォッチの仕組みを理解するためのドキュメントとサンプルをご覧ください。 DOM要素を削除するには、なぜ 'ng-if'を使用しないでください。私は手動でDOMと戦わないほうが良いと思います。 お手伝いをしてください。 – Ruben

答えて

1

scope.$watch('ngPermission', ...scope.$watch(attributes.ngPermission, ...を変更してみてください。

別のアプローチは$observeかもしれない - attributes.$observe('ngPermission', ...

+0

これは、値が未定義ですが、element.hide()がまだ動作していないという私の問題を解決しました。私は、正しいアクセス許可が送られてきたときにshow要素にアクセスするので、なぜ私が私のディレクティブを使用するdivが消えても関係ないので、なぜわかりません。 – Alphonse

+0

修正しました。ご協力いただきありがとうございます。 – Alphonse

+1

申し訳ありません私は前にあなたのコメントに返信しなかった - 私は電話に出ています。私はあなたがそれを作ってうれしいです! –

関連する問題