Angular2+:作用域 属性 (<div *prop="let p=obj.prop"></div>)

Angular2+: Scoped Property (<div *prop="let p=obj.prop"></div>)

我 HTML 多次这样:

     <div class="form-group">
            <label for="countPumps"> {{"CountPumps"|localize}}</label>
            <select id="countPumps"
                    class="form-control"
                    [ngClass]="{'edited':params.countPumps.value!=null}"
                    (ngModelChange)="params.countPumps.updateRefs()"
                    (blur)="params.countPumps.checkValue()"
                    [(ngModel)]="params.countPumps.value">
                       <option [ngValue]="1">1</option>
                       <option [ngValue]="2">2</option>
            </select>

    </div>

如您所见,我需要多次写“param.countPumps.xxxxx”。这是错误的来源,所以我宁愿这样:

     <div class="form-group" *theThingIdontKnowAbout="let param=params.countPumps">
            <label for="countPumps"> {{"CountPumps"|localize}}</label>
            <select id="countPumps"
                    class="form-control"
                    [ngClass]="{'edited':param.value!=null}"
                    (ngModelChange)="param.updateRefs()"
                    (blur)="param.checkValue()"
                    [(ngModel)]="param.value">
                       <option [ngValue]="1">1</option>
                       <option [ngValue]="2">2</option>
            </select>

     </div>

所以我想要的是“*theThingIdontKnowAbout”定义在此 DIV 中使用的对象。我不知道在那里写什么才能让它按照我想要的方式工作。 ngFor 就是这样做的,所以我尝试了这个,它有效,但它是 suuuper hacky:

<div class="form-group" *ngFor="let param of [params.countPumps]">
       <label for="countPumps"> {{"CountPumps"|localize}}</label>
             <select id="countPumps"
                     class="form-control"
                     [ngClass]="{'edited':param.value!=null}"
                     (ngModelChange)="0"
                    (blur)="param.checkValue()"
                     [(ngModel)]="param.value">
             <option [ngValue]="1">1</option>
             <option [ngValue]="2">2</option>
      </select>
</div>

如果没有什么方便的地方,我会直接创建组件,但在这一点上,这似乎还是有点过分了。

这是一个非常原始的结构指令,用于传递上下文:

@Directive({ selector: '[myContext]' })
export class MyContextDirective implements OnChanges {
  private _viewRef: EmbeddedViewRef<any> | null = null;
  @Input('myContext') context;
  @Input('myContextPath') path: string;

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

  ngOnChanges() {
    this._viewRef = this.viewContainer.createEmbeddedView(this.templateRef, {
      $implicit: this.context[this.path]
    });
  }
}

您可以像这样在模板中使用它:

<p *myContext="params; path:'countPumps'; let foo">{{foo.somePropOnCountPumps}}</p>