2016-10-15 5 views
1

に関連する入力を更新していない私はそうのようなバインディングと私の構成要素内のチェックボックスがあります。属性角度2のための結合は、バインドされた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> 

答えて

1

あなたが入力された名前としてidを使用している、あなたは、このidを持つDOM要素として、あなたのコンポーネントを取得します。チェックボックスに同じIDを付け、ラベルのforを追加します。しかし、同じidを持つ複数の要素がある場合、labelはそれらの最初のものを参照します。あなたの場合は、inputの代わりにコンポーネントを参照します。

入力パラメータの名前を変更します。

ちなみに、tsクラスの対応するフィールドを宣言するのは間違いありません。

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; 
    } 
}) 
+0

それで簡単です。回答いただきありがとうございます。 :) –

+0

@JohnHalbert、それは良い質問だった:)ところで、答えを受け入れる。 – Qwertiy

1

は、これらのいずれかを試してみてください。

<my-checkbox [name]="'test-name'" [id]="'test-id'"></my-checkbox> 
<my-checkbox name="test-name" [id]="'test-id'"></my-checkbox> 

あなたは文字列として値を渡す必要があり、 [property]="experession"、および文字列に評価する式の場合は、引用符で囲む必要があります'test-name'

plunker

+0

これは非常に問題を解決していません。 nameとidの値は、要素では未定義になります。ラベルの振る舞いは、最初のレンダリングされたチェックボックスの値が変更されたときに、同じid /属性値を共有するので、ラベルの振る舞いは元の状態に戻ります。コンポーネントまたはそのテンプレートに対応する変更がありますか? –

+0

@JohnHalbertは答えを – Sasxa

+0

として更新しました。これも正しいです。多くの点で、これを達成するための好ましい方法のように思えます。これは、テンプレートの価値を結び付けることです。私はバインドされた値が常に式であるという事実を見落としていたので、期待通りにバインドするには文字列または変数の値にする必要があります。 –

0

次の仕事をしていますか?

<input type="checkbox" name="{{name}}" id="{{id}} /><label for="{{id}}"></label>

+0

数分前に私の質問を更新しました。これは、Angularがラベル要素の既知のプロパティではないというエラーを出すため、機能しません。その解決策は '[htmlFor]'属性か '[attr.for]'属性バインディングのどちらかを使うことです。 –

関連する問題