<tr *ngFor = 'let worker of Workers' (mouseover)="showAdditionalData(worker,
$('#txtWorkerAdditionalData'))" >
或者可能使用旧的getElementByID。 这样做的最佳方式是什么? 附上一个代码块: 这是我想用worker name填充的html元素:
<input type="text" id="txtWorkerAdditionalData" />
这是js函数:
showAdditionalData(worker: IWorker, element: any) : void{
element.text = worker.FirstName;
alert (worker.FirstName);
}
答案 0 :(得分:2)
正如我在评论中提到的 - 当你使用像Angular或React这样的库时,很少有DOM操作。他们的一半吸引力是他们为你处理这些东西!
以下是我实现这种功能的方法。从showAdditionalData
中删除元素参数,然后传入worker:
<tr *ngFor="let worker of Workers" (mouseover)="showAdditionalData(worker)">
...
</tr>
然后,从工作人员中获取名字并将其分配给组件上的字段:
public currentWorkerName: string = "";
showAdditionalData(worker: IWorker): void {
this.currentWorkerName = worker.FirstName;
}
现在您可以将currentWorkerName
绑定到您的输入:
<input type="text" (value)="currentWorkerName" />
完成!并且没有看到DOM元素:)
这个答案假设表和输入都在同一个组件中,但如果不是这样的话,你就不会运气 - 要么使用@Input
和@Output
通过通过组件树的数据/事件,或将currentWorkerName
拉出到服务中并将其注入两个组件中。
答案 1 :(得分:0)
如果要引用模板中的元素,可以使用tempate变量和ViewChild装饰器来获取元素ref。
import { Component, ViewChild, ElementRef } from '@angular/core';
@Component({
selector: 'example',
template: `
<tr #templateVariable
*ngFor = 'let worker of Workers'
(mouseover)="showAdditionalData(worker, $('#txtWorkerAdditionalData'))">
`
})
export class ExampleComponent implements OnInit {
@ViewChild('templateVariable') element: ElementRef;
constructor(
) { }
ngOnInit() {
}
ngAfterViewInit() {
console.log('element: ', this.element.nativeElement.value);
}
}
你永远不应该直接访问dom,因为它违反了惯例,并且显然打破了很多Angular 2的功能。
您可以阅读有关ViewChild and ViewChildren here.的更多信息。
另请注意,即使没有模板变量,您也可以使用这些装饰器来获取任何类型的元素。请查看上面的链接以获取示例。
祝你好运!