AngularJSディレクティブを使用して、アプリケーション全体でフォームの特定の部分を無効にする場合は、ユーザーが特定の役割を持っているかどうか(属性値として与えられます。要素あたり)。ディレクティブのコードは次のようになります。単一の要素に新規/分離スコープを持つ2つの属性ディレクティブ
/** @ngInject */
function PermissionDirective() {
var directive = {
restrict: 'A',
scope: true,
bindToController: true,
controller: controller,
controllerAs: 'permission',
link: link
};
function link(scope, element, attrs) {
scope.soPermission = attrs.soPermission;
}
return directive;
}
/** @ngInject */
function controller($scope, $attrs, ...) {
var permission = this;
permission.granted = false;
$scope.soPermission = $attrs.soPermission;
init();
function init() {
var requiredPermission = $scope.soPermission;
permission.granted = // determine if user can use element
}
}
作業には独自のスコープが必要です。 HTMLでの使用には、次のとおりです。
<button type="button" ng-disabled="... || !permission.granted" so-permission="WRITE">
すべての罰金は限りso-permission
が新しいスコープを持つ要素で唯一のディレクティブであるとして。しかし、いくつかの要素はまた、新しい/隔離されたスコープを必要とすると思われるconfirmモーダルを使用します。これにより、角度エラーMultiple directives...が発生します。
私の質問は:どのようにこれを回避するのですか? so-permission
ディレクティブを修正して内部スコープを取り除き、それでも機能し続けるにはどうすればいいですか?(ライブラリとしてconfirm
のものに触れることはできません)
はい、コントローラー機能のために指令を放棄すると、私にとってはうまくいくかもしれません。私は疑いがある。この機能は、アプリケーション全体で使用する必要があります。これは、ui-routerの状態のいくつかの層で構成されています。私は各コントローラでこの機能を繰り返さないようにしたいと思います。そのための解決策はありますか? – pstobiecki
それを工場にして、それが必要な場所に工場を注入します。次に、関数自体を1か所で変更することができ、アプリケーション全体のすべての用途に伝播します。私は答えを更新しました。おかげさまで – frankrue
しかし、私は別の壁に当たったときです。ユーザーが持つアクセス権は、Webサービスから取得されます。呼び出しに起因する約束は、ui-routerの 'resolve'で解決されます。しかし、コントローラから関数を切り離すと、 'resolve'をもう使用することはできません。 Afaik、Angularでは、約束を強制的に解決するための合理的な方法はありません。関数の値がすぐに必要なので、ここでは役に立たない 'promise.then(){...}'イディオムしかありません。 – pstobiecki