<强大? 强>
结构指令通过添加和删除DOM元素来更改DOM布局.Angular中两个常见的结构指令是<代码> * ngIf 代码>和<代码> * ngFor> 代码。
*号是语法糖,用于避免使用复杂的语法。我们以* ngIf指令为例:
(图片https://netbasal.com/)
-
<李>角把主机(宿主元素)包装在模板标签里面李>
<李>角将ngIf转换为属性绑定——[ngIf]
李>
首先,让我们了解如何创建一个结构指令。接下来我们将要实现一个简单的ngIf指令。
进口{指令、输入、TemplateRef ViewContainerRef} ' @angular/核心”; @Directive({选择器:“[myNgIf]”}) 出口类MyNgIfDirective { 构造函数( 私人templateRef: TemplateRef私人viewContainer: ViewContainerRef) {} @Input()设置myNgIf(条件:布尔){ 如果(条件){ this.viewContainer.createEmbeddedView (this.templateRef); 其他}{ this.viewContainer.clear (); } } }
我们可以按照以下方式使用我们的指令:
& lt; div * myNgIf="条件"祝辞& lt;/div>
下面我们来解释一下上面的代码。
<强> TemplateRef 强>
如名字所示,TemplateRef用于表示模板的引用。
(图片https://netbasal.com/)
<强> ViewContainerRef 强>
正如上面介绍的,模板中包含了DOM元素,但如果要显示模板中定义的元素,我们就需要定义一个插入模板中元素的地方。在角中,这个地方被称作容器,而ViewContainerRef用于表示容器的引用。那什么元素会作为容器呢?
角将使用评论元素替换模板元素,作为视图容器。
我们来看一个具体的示例:
@ component ({ 选择器:“我的程序”, 模板: & lt; div> & lt; h3 * myNgIf="条件"祝辞你好{{名称}}& lt;/h3> & lt;按钮(点击)=疤跫?!条件”祝辞Click & lt;/div> ”, }) {出口类应用 名称:字符串; 条件:布尔=false; 构造函数(){ this.name=' Angular2 ' } }
以上代码成功运行后,浏览器的显示内容如下:
(图片https://netbasal.com/)
ViewContainerRef对象提供了<代码> createEmbeddedView() 代码>方法,该方法接收TemplateRef对象作为参数,并将模板中的内容作为容器(评论元素)的兄弟元素,插入到页面中。
现在,你已经了解如何创建结构指令,接下来让我们看看两个具体的实例。
<强>指令定义强>
@Directive({选择器:“[ifRole]”}) 出口类IfRoleDirective { 用户:美元的订阅; @Input (ifRole) roleName:字符串; 构造函数( 私人templateRef: TemplateRef私人viewContainer: ViewContainerRef, 私人authService: authService) {} ngOnInit () { 这一点。用户=this.authService.user美元 ,(()=比;this.viewContainer.clear ()) .filter(用户=比;用户。===this.roleName)作用 .subscribe(()=比;{ this.viewContainer.createEmbeddedView (this.templateRef); }); } ngOnDestroy () { this.user .unsubscribe美元(); } }
<强>指令应用强>
& lt; div * ifRole=癮dmin”比; 比; 比;> 进口{指令、输入、ViewContainerRef TemplateRef} ' @angular/核心”; @Directive ({ 选择器:“(范围)” }) 出口类RangeDirective { _range:[]号; @Input () 设置范围(价值:数字){ this.vcr.clear (); 这一点。_range=enerateRange价值(价值[0],[1]); this._range。forEach (num=比;{ this.vcr.createEmbeddedView(这一点。被称为tpl, { 隐式:美元num }); }); } 构造函数( 私人录像机:ViewContainerRef, 私人tpl: TemplateRef角2. x学习教程之结构指令详解