You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为<ng-content>投影的kendo-textbox设置label的for属性?

Kendo Label绑定Kendo TextBox时点击无法聚焦输入框的解决方法

问题场景

我要做一个info-label组件,布局是标签+信息图标在上,输入框在下:

(label) (i)
(input field)

组件初始代码:

<div class="label-container">
  <kendo-label class="k-form" [text]="text"></kendo-label>
  <kendo-icon *ngIf="info" name="info" themeColor="info" [title]="info"></kendo-icon>  
</div>

<ng-content></ng-content>

我给组件加了@Input() for: string|undefined;,想通过这个属性让点击标签时选中输入框,但用Kendo TextBox完全没效果:

<info-label text="ID" info="Identifier bla bla" for="foo">
  <kendo-textbox id="foo"></kendo-textbox>
</info-label>

但换成原生input,绑定[for]后功能正常:
组件代码:

<div class="label-container">
  <kendo-label class="k-form" [text]="text" [for]="for" />
  <kendo-icon *ngIf="info" name="info" themeColor="info" [title]="info"></kendo-icon> 
</div>

<ng-content></ng-content>

使用方式:

<info-label text="ID" info="Identifier bla bla" for="bar">
  <input type="text" id="bar">
</info-label>

问题原因

Kendo TextBox的DOM结构里,你设置的id="foo"是给Kendo组件本身的,内部的原生<input>元素会被自动生成一个派生ID(比如foo-1),kendo-label的for属性要匹配的是原生input的ID,不是组件的ID,所以直接绑定传入的for值找不到对应元素。

解决方案

修改info-label组件,通过@ContentChild获取投影进来的Kendo TextBox实例,拿到它内部原生input的真实ID,再绑定到kendo-label的for上:

修改后的组件代码

import { Component, Input, ContentChild, AfterContentInit } from '@angular/core';
import { TextBoxComponent } from '@progress/kendo-angular-inputs';

@Component({
  selector: 'info-label',
  template: `
    <div class="label-container">
      <kendo-label class="k-form" [text]="text" [for]="targetInputId"></kendo-label>
      <kendo-icon *ngIf="info" name="info" themeColor="info" [title]="info"></kendo-icon>  
    </div>
    <ng-content></ng-content>
  `
})
export class InfoLabelComponent implements AfterContentInit {
  @Input() text: string = '';
  @Input() info?: string;
  @Input() for?: string;
  
  @ContentChild(TextBoxComponent) kendoTextBox?: TextBoxComponent;
  targetInputId?: string;

  ngAfterContentInit(): void {
    // 优先用Kendo TextBox的原生input ID,没有的话 fallback 到传入的for值
    this.targetInputId = this.kendoTextBox?.inputId || this.for;
  }
}

这样不管是用原生input还是Kendo TextBox,点击标签都能正确聚焦输入框了。

内容的提问来源于stack exchange,提问作者boop

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 00:03:39