在没有使用*ngIf的情况下使用Angular的"as"?
使用Angular的"as"时没有*ngIf的原因是为了重用组件表达式,可以在ng-container中使用,也可以通过指定trackBy函数来减少重新创建嵌套内容的次数。
解决方法是在ng-container中使用*ngFor指令,并通过trackBy函数返回相同的id以减少重新创建嵌套内容的次数。
代码示例:
{{DRYItUp.prop1}} {{DRYItUp.prop2}}
最终解决方案是在HTML中使用*ngFor指令,并通过trackBy函数返回常量true,在ts文件中定义trackFn函数。
代码示例:
HTML:
{{var}}
TS:
trackFn() { return true; }
这样做可以重用组件的成员/属性,并减少重新创建嵌套内容的次数。无论返回什么值,只需要是一个常量即可。
在Angular中,可以通过使用Angular 2中的template
元素或Angular 4+中的ng-template
在HTML代码中声明变量。模板具有一个上下文对象,可以使用let
绑定语法将其属性分配给变量。请注意,您必须为模板指定一个出口,但它可以是对自身的引用。
通过使用上下文对象的$implicit
属性而不是自定义属性,可以减少代码量。
上下文对象可以是字面对象或任何其他绑定表达式。其他有效的示例:
如果表达式是一个函数,例如treeControl.isExpanded(node)
,那么使用ng-template
实际上有助于提高效率,例如减少更改检测次数吗?
这受到更改检测策略的影响,与任何其他绑定表达式一样。因此,isExpanded(node)
在每次更改检测运行时都会被评估。在这方面没有真正的改进,除非您在模板中多次绑定结果。多次解引用变量比多次评估函数更有效,这是显而易见的原因。
要使其工作,我不得不将您的代码从<template...
更改为<ng-template...
。
是的,您只能在Angular 2中使用<template>
。在Angular 4中,您可以使用<template>
或<ng-template>
,但应仅使用<ng-template>
。Angular 5不再支持<template>
。
#t
是一个存储ng-template
的模板变量。它在[ngTemplateOutlet]="t"
中用于使ng-template引用自身。
这很奇怪,但它确实起作用!Angular应该通过内置的变量指令使这更简单。谢谢。
似乎对ng12过时了。
怎么会呢?我在StackBlitz中尝试了我的代码示例,它仍然可以工作。
它找不到ngTemplateOutletContext。我尝试得很快,可能是错误的。
可能是您没有添加<ng-template #t [ngTemplateOutlet]="t" ...>
吗?这是您可能会看到Can't bind to 'ngTemplateOutletContext' since it isn't a known property
错误的原因之一。
在Angular中使用"as"而不使用*ngIf的原因是为了在模板中创建一个上下文,将一个变量绑定到一个表达式,并使用该变量在模板中进行操作。这样可以避免在模板中重复使用相同的表达式,并且可以使代码更加简洁和可读。
然而,目前的Angular版本并没有提供类似于*ngIf的内置指令来实现这种行为。因此,需要自定义一个指令来实现这个功能。可以创建一个名为*ngVar的指令,将变量绑定到一个上下文中,并在模板中使用这个上下文来操作变量。
下面是一个示例指令的代码:
import { Directive, EmbeddedViewRef, Input, TemplateRef, ViewContainerRef } from '@angular/core'; @Directive({ selector: '[ngVar]', }) export class NgVarDirective{ private _context: NgVarContext = new NgVarContext (); private _viewRef: EmbeddedViewRef > | null = null; @Input() set ngVar(context: T) { this._context.$implicit = this._context.ngVar = context; if (!this._viewRef) { this._viewRef = this._viewContainer.createEmbeddedView( this._templateRef, this._context ); } } constructor( private _viewContainer: ViewContainerRef, private _templateRef: TemplateRef > ) {} } export class NgVarContext { public $implicit: T = null!; public ngVar: T = null!; }
使用这个指令可以在模板中使用类似于*ngIf的语法来绑定变量:
{{variable | json}}
或者
{{variable | json}}
或者
{{variable | json}}
或者
{{variable | json}}
这样就可以在模板中使用变量"variable"来操作绑定的表达式了。
解决方法的关键是自定义一个指令,将变量绑定到一个上下文中,并在模板中使用这个上下文来操作变量。这样可以避免在模板中重复使用相同的表达式,使代码更加简洁和可读。