Host要素をページに表示するかどうかを決定するディレクティブを作成したいと思います。理想的には、cssで非表示/表示するだけでなく、DOMから要素を削除したいと思います。ユースケースは次のとおりです。
<ul role="navigation">
<li><a>public link</a></li>
<li><a>public link2</a></li>
<li access="admin"><a>admin-only link</a></li>
</ul>
UserServiceを使用してcurrentUserロールを取得し、adminがない場合は、li
が削除されます。
ng-if
(angular 2)でまだ利用可能な場合)で同じ効果を達成できると思います。式を渡してメインコンポーネントで評価します。ただし、ディレクティブを使用すると、より多くの効果が得られます。セマンティックでエレガント。
出来ますか?
import {Directive} from 'angular2/angular2';
@Directive({
selector: 'access'
})
export class Access {
//what goes here
}
angular 1(ディレクティブのcompile
関数内)で簡単に実行できましたが、Angular 2でこれを実行するにはどうすればよいですか?
この実装は、ngIfディレクティブと同様になります。そして、Angular 構造ディレクティブのガイド (これも作成する予定です)は、myUnless
を逆にするngIf
の例を示しています。 。
アクセスの実装は、myUnless
の実装と似ています。
@Directive({ selector: '[access]' })
export class AccessDirective {
constructor(
private _templateRef: TemplateRef,
private _viewContainer: ViewContainerRef
) { }
@Input() set myUnless(condition: boolean) {
if (condition) {
this._viewContainer.createEmbeddedView(this._templateRef);
} else {
this._viewContainer.clear();
}
}
}
そしてそれを次のように使用します:
<li *access="isAdmin"><a>admin-only link</a></li>
DOMから要素を削除するには、*ngIf
ディレクティブを使用します。
しかし、もしあなたが本当にあなた自身のディレクティブを使うことを主張するなら、私は ElementRef が行く方法であると信じています。これの使用についてはアドバイスしませんが
次のようなものが得られます。
import {Directive} from 'angular2/angular2';
@Directive({
selector: '[access]' //this is how you address an attribute directive
})
export class Access {
constructor(private _userService : UserService, private _elementRef : ElementRef) {}
ngOnInit() {
this._checkAdmin();
}
private _checkAdmin() : void {
if(!this._userService.currentUser.hasRole('admin')) {
let el : HTMLElement = this._elementRef.nativeElement;
el.parentNode.removeChild(el);
}
}
}