当前位置: 首页 > Web前端 > JavaScript

Angular使用技巧:NgIf非常规用法

时间:2023-03-26 22:32:11 JavaScript

NgIf是Angular中使用频率非常高的命令。它的作用很简单,就是定义一个表达式,根据确定的结果匹配对应的模板。基本用法

Contenttorenderwhenconditionistrue.Contenttorenderwhenconditionisfalse.上面的语法可以很容易理解为当判断表达式条件为真时,使用thenBlock模板内容,否则使用elseBlock模板内容。这是NgIf的一种用法,还有其他更简洁的用法,详见NgIfAPI。API中已经详细介绍了一些常用的用法,基本的用法可以参考文档。今天我们主要讲一下NgIf的一个非常规用法。模板中的临时变量在angular组件模板中,有时候我们可能需要定义一个临时变量来提高性能,比如下面这个组件:HTML{{getDisplayText(item)}}
TS@Component({selector:'list',//...})exportclassListComponent{@Input()项:数组<任意>;@Input()显示成员:字符串;getDisplayText(item:any):any{返回this.displayMember?(项目&&项目[this.displayMember]):项目;这是一个简单的列表组件,绑定一个数组,通过指定的displayMember设置列表项要显示的文本内容。在组件模板html中,使用span标签将每一个要显示的文本包裹起来,并设置其标题与显示的文本相同。因为显示文字可以动态设置(displayMember),所以我们把相关逻辑放在了getDisplayText方法中。细心的你会发现,在我们的html模板中,为了在两个地方(标签包裹的内容和标题)进行文字显示,我们调用了两次getDisplayText,但实际上两次调用是重复的。这种问题如果定义在js代码中,定义临时变量的问题就解决了,但是angular组件模板并没有给我们提供定义临时变量的指令。这时候,我们的主角NgIf就会出现。NgIf的众多用法之一如下:NgIf的用法之一{{value}}
这种条件作为值可以将表达式转换为变量,而这个变量在其作用域(节点)内是有效的,相当于变相地为我们提供了在模板中定义临时变量的能力。更新的HTML{{text}}
现在我们通过这个变相的临时变量,将原来需要调用两次的方法减少为一次调用,减少不必要的性能损失,这在更复杂的场景下会更加显着。不过,现在高兴还为时过早。这里有一个问题。不管NgIf怎么用,归根结底还是会遵循自己的原则,就是定义表达式。所以问题是当getDisplayText(item)的返回结果为false时,并没有生成对应的span节点。如果其中一项为null或0,则null或0转换为布尔值将为false,因此不会生成该节点,这不能满足我们对显示字符串“0”的期望。解决办法其实很简单,我们可以将返回的结果封装成一个对象,因为对象决定了结果永远为真。再次更新HTML{{temp.text}}至此我们就有了一个比较完善的模板临时变量。扩展不仅仅是一个变相的模板临时变量,它还可以通过扩展它来做更多的事情。比如,有时候我们可能需要在生成模板的某个节点的时候做一些事情,这就可以为我们提供代码交互的机会。我们在上面的组件中添加一个数据项绑定事件,并将相应的自定义函数暴露给组件用户。HTML{{ctx.text}}TS@Component({selector:'list',//...})exportclassListComponent{@Input()项目:数组<任何>;@Input()显示成员:字符串;getDisplayText(item:any):any{返回this.displayMember?(项目&&项目[this.displayMember]):项目;}//添加绑定事件@Output()itemBinding=newEventEmitter<{item:any,index:number,textColor?:string}>();getBindingContext(item:any,index:number):{text:string,textColor?:string}{letargs:{item:any,index:number,textColor?:string}={item,index};复制代码this.itemBinding.emit(args);返回({文本:this.getDisplayText(item),textColor:args.textColor});}}现在组件用户可以通过订阅itemBinding事件来自定义每一项的文字显示颜色使用1使用2