angular - 结构指令上下文可以包含函数吗?
问题描述
我创建了一个简单的结构指令来帮助为一些自定义组件生成唯一 ID。
import { Directive, DoCheck, Input, TemplateRef, ViewContainerRef } from '@angular/core';
import { v4 as uuid } from 'uuid';
export class UniqueIdContext {
constructor(private $implicit: string) {}
at(index: number) {
return `${this.$implicit}_${index}`;
}
}
@Directive({
selector: '[uniqueId]'
})
export class UniqueIdDirective implements DoCheck {
@Input()
set uniqueIdFor(uniqueIdFor: string) {
this._uniqueIdFor = uniqueIdFor;
this._uniqueIdDirty = true;
}
private _uniqueIdFor: string;
private _uniqueIdDirty = false;
constructor(
private templateRef: TemplateRef<UniqueIdContext>,
private viewContainerRef: ViewContainerRef
) {}
ngDoCheck(): void {
if (this._uniqueIdDirty) {
this._uniqueIdDirty = false;
const prefix = uuid();
const name = this._uniqueIdFor;
const id = `${prefix}_${name}`.replace(/-/g, '');
this.viewContainerRef.createEmbeddedView(
this.templateRef,
new UniqueIdContext(id)
);
}
}
}
用法如下所示:
<div *uniqueId="let id for 'control'">
<input [attr.id]="id" [formControl]="control">
<label [attr.for]="id">My Label</label>
</div>
如果我想按原样使用 id,这很有效。但是,我打算在ngFor
循环中使用它来在每次迭代时为控件生成 id,它将索引添加到生成的 id 的后缀。这就是该UniqueIdContext.at()
功能的目的,但它似乎不起作用。
<ul *uniqueId="let id for 'control'">
<li *ngFor="let control of controls; index as i">
<input [attr.id]="at(i)" [formControl]="control">
<label [attr.for]="at(i)">My Label {{i}}</label>
</li>
</ul>
我也尝试过id.at(i)
,id(i)
但没有用。我想把这一切都包含在这个指令/上下文中。
我需要以某种方式声明模板变量吗?我怎样才能使这项工作?
解决方案
所以看起来这里的主要限制是使用this
. 我需要将该方法绑定到this
,然后为其声明一个模板变量。
export class UniqueIdContext {
constructor(private $implicit: string) {
this.at = this.at.bind(this);
}
at(index?: number) {
return index != null ? `${this.$implicit}_${index}` : this.$implicit;
}
}
<ul *uniqueId="let id for 'control'; at as idAt">
<li *ngFor="let control of controls; index as i">
<input [attr.id]="idAt(i)" [formControl]="control">
<label [attr.for]="idAt(i)">My Label {{i}}</label>
</li>
</ul>
推荐阅读
- c# - 是否可以在 MVC 中捕获响应并出错?
- angular - 单击编辑数据时如何获取日期
- node.js - Nodejs-Mongoose 子文档更新
- firebase - Flutter:无法通过 Firebase 连接访问 Build Widget 中的类属性
- mysql - MySql Databe - 列出只有一个类别的产品
- deep-learning - RuntimeError: cudnn RNN backward 只能在训练模式下调用
- angular - 如何在 canActivate 方法中获取标头值
- mxnet - 如何从 mx.ndarray 中释放内存
- docker - Docker 拉取:`remove /.pivot_root347438920: device or resource busy`
- mdx - 通过 FDMEE 从 essbase 导出数据