2017-07-13 4 views
0

従業員レコードのオブジェクトを受け取ってテーブルに表示するコンポーネントがあります。各レコードには、次のプロセスに含める従業員を「選択」できるチェックボックスがあります。このコンポーネントでAngular2 - 検査時に配列にチェック値をプッシュ

<tr *ngFor="let i of importResults" > 
<td> 
    <input type="checkbox" 
     value="{{ i.QID }}" 
     attr.data-employeename="{{ i.PreferredName }} {{ i.LastName }}" 
     [checked]="isSelected" /> 
    </td> 
    <td>{{ i.PreferredName }} {{ i.LastName }}</td> 
</tr> 

、私は配列selectedEmployees = [];を作成し、私の目標は、私は、チェックボックスをクリックすると、その値が配列にプッシュされるだけでなく、私はそれをオフにする場合、値が配列から削除されていることです。

ngModel2 way bindingにしようとしましたが、このデータにはオブジェクトの初期チェック値がないため、正常に動作しませんでした。

これを達成する最も良い方法はngModelですか?たぶん私はそれについて間違った方向に行っていたのかもしれません。

this questionに従ってみましたが、typescriptは.entriesが無効であるとエラーを送出しました。それは、角度の古いバージョンのされている可能性があります?

+0

チェックされた従業員のリストを作成して次のプロセスに移るのはどうでしょうか?それはもっと楽になるだろう。 – Steveadoo

+0

@Steveadoo私はそれがオプションになると思います。それでもコンポーネント間のコミュニケーション全体を把握しようとしているので、次のプロセス(兄弟コンポーネント)でそれらの値を取得することは、私が把握する必要があります。提案していただきありがとうございます。 – SBB

+0

isSelectedプロパティを "i"変数に格納できます。次に、選択した従業員だけを選択するために 'importResults.filter(i => i.isSelected)'を実行します。その結果をコンポーネントのフィールドに格納し、そのフィールドを兄弟コンポーネントに渡すことができます。そのためにはngModelを使用する必要があります。 – Steveadoo

答えて

1

チェックボックスにclickイベントを追加し、追加または削除を処理する関数に渡すことができます。

HTML:

<div *ngFor="let i of importResults" > 
<div> 
    <input type="checkbox" 
     value="{{ i.QID }}" 
     (click)="change(i)"/> 
    <span>{{ i.PreferredName }} {{ i.LastName }}</span> 
    </div> 
</div> 

<p> Selected Employee: {{selectedEmployees | json}} </p> 

component.ts:

export class SelectFormExample { 
    selectedEmployees = []; 

    showSiblingComp = false; 

    importResults = [ 
    {QID: "1", PreferredName: 'Steak', LastName: "Pizza"}, 
    {QID: "2", PreferredName: 'Cheese', LastName: "Burger"}, 
    {QID: "3", PreferredName: 'Chicken', LastName: "Panini"} 
    ]; 

    constructor(private service: SharedService){ 

    } 

    change(obj){ 

    let updateItem = this.selectedEmployees.find(this.findIndexToUpdate, obj.QID)); 

    let index = this.selectedEmployees.indexOf(updateItem); 

    console.log(index); 

    if(index > -1){ 
     this.selectedEmployees.splice(index, 1); 
    } 
    else{ 
     this.selectedEmployees.push(obj); 
    } 

    this.service.setList(this.selectedEmployees); 

    } 

    findIndexToUpdate(obj) { 
     return obj.QID === this; 
    } 
} 

demo

Iは、共有サービスを介し兄弟成分とselectedEmployeesを共有含むようにデモを拡張しました。

+0

これは、 '.checked'がプロパティではないという、いくつかのタイスクリプトエラーを返しました。 – SBB

+0

おそらく、idで要素を見つけることができません。入力フィールドの 'id'が' id = "チェックボックス{{i.QID}}"に設定されていることを確認するか、別のIDを持っている場合はその関数で使用されています。それはデモで働いています:S。 – Nehal

+0

奇妙なことに、これはあらかじめコンパイルされたエラーなので、まだHTMLテンプレートをチェックしていません。私はそれを正しくそこに追加しました。 'Check 'プロパティが' HTMLElement '型に存在しません。' – SBB

関連する問題