属性 Angular 2 的绑定不会更新具有绑定 ID 的关联输入
Binding for attribute Angular 2 doesn't update associated input with bound id
我的组件中有一个复选框,其绑定如下:
<input type="checkbox" [name]="name" [id]="id" /><label [htmlFor]="id"></label>
加载组件时,我可以检查元素并发现传递给这些输入的值已绑定,但是当我单击标签时,复选框未被选中。
我也这样试过:
<input type="checkbox" [attr.name]="name" [attr.id]="id" /><label [attr.for]="id"></label>
<input type="checkbox" name="{{name}}" id="{{id}} /><label [attr.for]="id"></label>
及其组合。它们都产生相同的效果,数据已绑定,复选框未选中。
这是我的组件:
import { Component } from '@angular/core';
@Component({
inputs: ['name', 'id'],
selector: 'my-checkbox',
templateUrl: 'app/form/input/checkbox.component.html'
})
export class CheckboxComponent {}
以及 html 的使用位置:
<my-checkbox name="test-name" id="test-id"></my-checkbox>
尝试以下方法之一:
<my-checkbox [name]="'test-name'" [id]="'test-id'"></my-checkbox>
<my-checkbox name="test-name" [id]="'test-id'"></my-checkbox>
您需要将值作为字符串传递,[property]="experession"
,并且要将表达式计算为字符串,它必须包含在引号中 'test-name'
。
以下是否有效?
<input type="checkbox" name="{{name}}" id="{{id}} /><label for="{{id}}"></label>
当您使用 id
作为输入名称时,您的组件将作为具有此 ID 的 dom 元素。它将相同的 id 添加到复选框和标签的 for
。但是当你有多个具有相同 id 的元素时,label 指的是其中的第一个。在你的情况下,它指的是你的组件而不是 input
.
只需重命名输入参数即可。
顺便说一句,在ts中声明相应的字段是正确的class。
http://plnkr.co/edit/JazXV3Oi91hSBTdVlBHh?p=preview
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<my-checkbox-broken id="test-id-1"></my-checkbox-broken><br>
<my-checkbox-broken [id]="'test-id-2'"></my-checkbox-broken> can work too<br>
<my-checkbox-working chkId="test-id-3"></my-checkbox-working><br>
<output></output>
`
})
export class AppComponent {
}
@Component({
inputs: ['id'],
selector: 'my-checkbox-broken',
template: '<input type="checkbox" [id]="id" /><label [htmlFor]="id">Broken :(</label>'
})
export class CheckboxComponent_Broken {
id: string;
}
@Component({
inputs: ['chkId'],
selector: 'my-checkbox-working',
template: '<input type="checkbox" [id]="chkId" /><label [htmlFor]="chkId">Working!</label>'
})
export class CheckboxComponent_Working {
chkId: string;
}
document.addEventListener('click', ({ target: { htmlFor: id } }) => {
if (id) {
document.querySelector('output').textContent = id + " is " + document.getElementById(id).tagName;
}
})
我的组件中有一个复选框,其绑定如下:
<input type="checkbox" [name]="name" [id]="id" /><label [htmlFor]="id"></label>
加载组件时,我可以检查元素并发现传递给这些输入的值已绑定,但是当我单击标签时,复选框未被选中。
我也这样试过:
<input type="checkbox" [attr.name]="name" [attr.id]="id" /><label [attr.for]="id"></label>
<input type="checkbox" name="{{name}}" id="{{id}} /><label [attr.for]="id"></label>
及其组合。它们都产生相同的效果,数据已绑定,复选框未选中。
这是我的组件:
import { Component } from '@angular/core';
@Component({
inputs: ['name', 'id'],
selector: 'my-checkbox',
templateUrl: 'app/form/input/checkbox.component.html'
})
export class CheckboxComponent {}
以及 html 的使用位置:
<my-checkbox name="test-name" id="test-id"></my-checkbox>
尝试以下方法之一:
<my-checkbox [name]="'test-name'" [id]="'test-id'"></my-checkbox>
<my-checkbox name="test-name" [id]="'test-id'"></my-checkbox>
您需要将值作为字符串传递,[property]="experession"
,并且要将表达式计算为字符串,它必须包含在引号中 'test-name'
。
以下是否有效?
<input type="checkbox" name="{{name}}" id="{{id}} /><label for="{{id}}"></label>
当您使用 id
作为输入名称时,您的组件将作为具有此 ID 的 dom 元素。它将相同的 id 添加到复选框和标签的 for
。但是当你有多个具有相同 id 的元素时,label 指的是其中的第一个。在你的情况下,它指的是你的组件而不是 input
.
只需重命名输入参数即可。
顺便说一句,在ts中声明相应的字段是正确的class。
http://plnkr.co/edit/JazXV3Oi91hSBTdVlBHh?p=preview
import { Component } from '@angular/core';
@Component({
selector: 'my-app',
template: `
<my-checkbox-broken id="test-id-1"></my-checkbox-broken><br>
<my-checkbox-broken [id]="'test-id-2'"></my-checkbox-broken> can work too<br>
<my-checkbox-working chkId="test-id-3"></my-checkbox-working><br>
<output></output>
`
})
export class AppComponent {
}
@Component({
inputs: ['id'],
selector: 'my-checkbox-broken',
template: '<input type="checkbox" [id]="id" /><label [htmlFor]="id">Broken :(</label>'
})
export class CheckboxComponent_Broken {
id: string;
}
@Component({
inputs: ['chkId'],
selector: 'my-checkbox-working',
template: '<input type="checkbox" [id]="chkId" /><label [htmlFor]="chkId">Working!</label>'
})
export class CheckboxComponent_Working {
chkId: string;
}
document.addEventListener('click', ({ target: { htmlFor: id } }) => {
if (id) {
document.querySelector('output').textContent = id + " is " + document.getElementById(id).tagName;
}
})