Dichiarare variabili neiテンプレートに対する角のuna direttivaにおいて来てください


Volte Sarebbe Utile Poter Dichiarare variabili neiのテンプレートHTML dei component , ad esempio , imaverinio di avere un osservabile , il cui valore va visualzato pi pino del nostro template , na delle possibili soluzioniθquale di sottoscrivere pi . volte l ososabile , usando la pipeasync , <研究ノート>パフォーマンスに関する一考察
import { Component } from '@angular/core';
import { Observable, timer } from 'rxjs';

@Component({
  selector: 'app-root',
  template: `
    <ul>
      <li>{{ timer$ | async }}</li><!-- prima sottoscrizione -->
      <li>{{ timer$ | async }}</li><!-- seconda sottoscrizione -->
    </ul>
  `,
})
export class AppComponent {
  public timer$: Observable<number> = timer(3000, 1000);
}
Oppure Si Potrebbe Cauty Nuna Singola Sottoscrizione e Geskil il Tutto Conn unun Periet et esesa al Template , Connun Notevole Aumento del Codites : Geesil il Tutto
import { Component, OnInit } from '@angular/core';
import { Observable, timer, Subscription } from 'rxjs';

@Component({
  selector: 'app-root',
  template: `
    <ul>
      <li>{{ time }}</li>
      <li>{{ time }}</li>
    </ul>
  `,
})
export class AppComponent implements OnInit, OnDestroy {

  public time: number;
  private timer$: Observable<number> = timer(3000, 1000);
  private subscription: Subscription;

  ngOnInit(){
    // singola sottoscrizione
    this.subscription = this.$timer.subscribe(value => this.time = value);
  }

  ngOnDestroy(){
    this.subscription.unsubscribe();
  }
}
<研究ノート>二重における二重性の可能性について
import { Component } from '@angular/core';
import { Observable, timer } from 'rxjs';

@Component({
  selector: 'app-root',
  template: `
    <!-- singola sottoscrizione -->
    <ng-container *ngLet="timer$ | async as time">
      <ul>
        <li>{{ time }}</li>
        <li>{{ time }}</li>
      </ul>
    </ng-container>
  `,
})
export class AppComponent {
  public timer$: Observable<number> = timer(3000, 1000);
}
Vediamo quindi来るrealizzarla!
インプットの中のパラフレーズとは何か
import { Directive, Input } from '@angular/core';

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective {

    @Input()
    set ngLet(value: any) {

    }
}
<論文>インプット・ギアスにおける「パス・フォ・ヴァルレ・パッタート」について
<div *ngLet="1 + 1 as sum">
  {{ sum }}
</div>
Outtenerlo Dobbiamo Rendere , Noesta dimettiva strutturale , questo ci permetter alla stra turutura ( il tag sul quale sor gggiata ) un "contesto "che conpoo "no uno stato interno e quindi memorizzare unvalore che sar . poi access irton conas :
<div *ngLet="1 + 1 as sum">{{ sum }}</div>
<研究ノート> Nanhiarazioneについてlet :
<div *ngLet="1 + 1; let sum">{{ sum }}</div>
エストラーヌ・ラ・ノストラーストラー・ストラットヴァーラ著『アシュアモ・イ・コン・ディ・クレア』、『アル・インター・デ・ヴィラ・コルレンテ』、『アル・ホテ・デ・ヴィラ』
import { Directive, Input } from '@angular/core';

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective {

    constructor(
       private viewContainer: ViewContainerRef, 
       private templateRef: TemplateRef<any>) { }

    @Input()
    set ngLet(value: any) {

    }
}
<研究ノート>第二次世界大戦におけるテンプレートの構成とその意味
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective {

    private context = { ngLet: null, $implicit: null };

    constructor(
       private viewContainer: ViewContainerRef, 
       private templateRef: TemplateRef<any>) { }

    @Input()
    set ngLet(value: any) {
        this.context.$implicit = this.context.ngLet = value;
        this.viewContainer.createEmbeddedView(this.templateRef, this.context);
    }
}
E '重要なChee IL Contesto、前提となる所有権のない
{ 
   ngLet: any;
   $implicit: any;
}
ハト$implicit 二分法による二重引用let , esempio :
<div *ngLet="1 + 1; let sum">{{ sum }}</div>
メントレアの所有者ngLet <論説>アル・コンテリオの悲劇as , esempio :
<div *ngLet="1 + 1 as sum">{{ sum }}</div>
エステに対するQuesto Punto Dobbiamo di creare ilテンプレートset ngLet(value: any) ) ビエンインゴート、クインディAggiungiamo国連旗hasView 1つのcreare una sola volta ilテンプレート:
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective {

    private context = { ngLet: null, $implicit: null };
    private hasView: boolean = false;

    constructor(
       private viewContainer: ViewContainerRef, 
       private templateRef: TemplateRef<any>) { }

    @Input()
    set ngLet(value: any) {
        this.context.$implicit = this.context.ngLet = value;
        if (!this.hasView) {
            this.viewContainer.createEmbeddedView(this.templateRef, this.context);
            this.hasView = true;
        }
    }
}
Potremmo Essenere soddisfatti del risultato gi se cos cos , ma la la nostra direttiva avrebbe una ppecca,il valore restiitto non sarebbe tipicbzato e quindi risulterebbe el template ununany .
Physamo Quitaal - a a a a a piilizza e al - pieno . della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone della direttivazazone
Quando La Nostra direttiva SAR
<div *ngLet="1 as value">{{ value }}</div>
ダオチェ1 杜運number イルTipoパパスAllaクラスnumber :
new NgLetContext<number>();
<研究ノート> Chiamememoに対する批判的考察T , Thepicizzare Tutto IL Nostro ContestoにおけるSua Voltaの利用法
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

interface NgLetContext<T> {
    ngLet: T;
    $implicit: T;
}

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective<T> {

    private context: NgLetContext<T | null> = { ngLet: null, $implicit: null };
    private hasView: boolean = false;

    constructor(
       private viewContainer: ViewContainerRef, 
       private templateRef: TemplateRef<NgLetContext<T>>) { }

    @Input()
    set ngLet(value: T) {
        this.context.$implicit = this.context.ngLet = value;
        if (!this.hasView) {
            this.viewContainer.createEmbeddedView(this.templateRef, this.context);
            this.hasView = true;
        }
    }
}
Tuttavia Questo非Bestaモーチェルアイビーfaccia国連運航del tipo passato e quindi ottenere tutti i vantaggi di aver tipicizzato il nostro contestoの料金<研究ノート>ダルビーム・アギンガージェーナにおけるティヴォーエの統語論
static ngTemplateGuard_ngLet: 'binding';
<研究ノート>第二次世界大戦における権力者としての行為:第二次世界大戦後のヴェトナムにおける支配権true パーチ・シオ・シモctx ) SAR - Ang sempre del TipoT パスパルトゥー・クラス
static ngTemplateContextGuard<T>(dir: NgLetDirective<T>, ctx: any): ctx is NgLetContext<Exclude<T, false | 0 | '' | null | undefined>> {
    return true;
}
Il risultatoフィナーレ
import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

interface NgLetContext<T> {
    ngLet: T;
    $implicit: T;
}

@Directive({
    selector: '[ngLet]'
})
export class NgLetDirective<T> {

    private context: NgLetContext<T | null> = { ngLet: null, $implicit: null };
    private hasView: boolean = false;

    constructor(
       private viewContainer: ViewContainerRef, 
       private templateRef: TemplateRef<NgLetDirective<T>>) { }

    @Input()
    set ngLet(value: T) {
        this.context.$implicit = this.context.ngLet = value;
        if (!this.hasView) {
            this.viewContainer.createEmbeddedView(this.templateRef, this.context);
            this.hasView = true;
        }
    }

    static ngTemplateGuard_ngLet: 'binding';

    static ngTemplateContextGuard<T>(dir: NgLetDirective<T>, ctx: any): ctx is NgLetContext<Exclude<T, false | 0 | '' | null | undefined>> {
        return true;
    }
}
Stackblitzを守ってください
LINK
<資料>
  • 国立天文台https://www.npmjs.com/package/ng-let
  • ギタブhttps://github.com/nigrosimone/ng-let