0

認証サービスから指示された場合にのみレンダリングするディレクティブがあります。

<div my-loggedin-directive ng-if="security.isAuthenticated()"></div>

ディレクティブ自体は非常に空です:

.directive('myLoggedinDirective', [
    function() {
        return {
            templateUrl: 'modules/myLoggedinDirective.tpl.html',
            restrict: 'A',
            replace: true,
            link: function($scope) {
                 $scope.$on('$destroy', function() {
                     console.log('$destroy');
                 });
            }
        };
    }
]);

ディレクティブはログイン時に常にレンダリングされる必要があるため、ngIf ロジックは ng-if ではなく、ディレクティブ宣言内にある必要があります (ngIf のないディレクティブは完全に壊れてしまいます)。

と同じ動作が必要であることを認識して、ディレクティブ コードを変更するには (ディレクティブ宣言内のセキュリティ サービスにテストを挿入する)、どうすればよいngIfですか? :

  • nfIfに解決される場合にのみ DOM に存在するディレクティブtrue
  • nfIf解決時に $destroy の自動呼び出しfalse) ?

compile関数と監視するウォッチャーを使用しようとしましたsecurity.isAuthenticated()が成功しませんでした

4

1 に答える 1

0

セキュリティ オブジェクトをディレクティブに渡す追加のディレクティブ属性を宣言します。

<div my-loggedin-directive my-security='security'></div>

ディレクティブにはスコープを含める必要があります。双方向バインディングを使用していることを確認してください。

.directive('myLoggedinDirective', [
function() {
    return {
        scope: {
            security: "=mySecurity"
        }
        templateUrl: 'modules/myLoggedinDirective.tpl.html',
        restrict: 'A',
        replace: true,
        link: function($scope) {
             $scope.$on('$destroy', function() {
                 console.log('$destroy');
             });

             $scope.$watch('security', function(newVal, oldVal) {
                 if (newVal.isAuthenticated()) {
                 // do something
                 } else {
                 // do something
                 }
             });
        }
    };
}

]);

これで、テンプル myLoggedinDirective.tpl.html の $scope.security 変数にアクセスできるようになりました

<div ng-if="security.isAuthenticated()">...</div>
于 2014-06-10T09:50:40.907 に答える