在没有使用*ngIf的情况下使用Angular的"as"?

18 浏览
0 Comments

在没有使用*ngIf的情况下使用Angular的"as"?

我有以下模板:\n

  {{aVariable}}

\n我想要得到:\n

  {{a}}

\n有办法实现吗?

0
0 Comments

使用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; }

这样做可以重用组件的成员/属性,并减少重新创建嵌套内容的次数。无论返回什么值,只需要是一个常量即可。

0
0 Comments

在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错误的原因之一。

0
0 Comments

在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"来操作绑定的表达式了。

解决方法的关键是自定义一个指令,将变量绑定到一个上下文中,并在模板中使用这个上下文来操作变量。这样可以避免在模板中重复使用相同的表达式,使代码更加简洁和可读。

0