2

Angular 2.0.0-RC.4 を使用して Angular 2 パイプを構築しています。プロパティ バーに基づいて、Foo の配列として渡されたすべての Foo オブジェクトをフィルター処理する必要があります。デバッガーでコードをステップ実行すると、「allFoo」変数と「bar」変数が入力されます。コンソールで foos.filter() コードをブレークポイントして実行すると、期待どおりの配列が返されます。関数を終了させると、何も返されません。

コードに問題があるのでしょうか、それとも Angular 2 RC4 のバグでしょうか?

タイプスクリプトは次のとおりです。

import { Pipe, PipeTransform } from '@angular/core';
import { Foo } from '../foo';

@Pipe({
    name: 'barFilterPipe'
})

export class BarFilterPipe implements PipeTransform {
    transform(allFoo: Foo[], bar: string) {
        console.log(allFoo); //data appears correctly here
        console.debug(bar); //and correctly here
        if (allFoo) {
            if (bar == "" || bar == undefined) {
                return allFoo; //if user clears filter
            } else {
                let results: Foo[] = allFoo.filter(afoo => {
                    afoo.bars.indexOf(bar) !== -1; //breakpoint here and type this into console, it returns proper data
                });
                console.log(results); //nothing is returned here
                return results; // or here
            } 
        }
    }
}

参考までに、各 Foo オブジェクトは次のようになります。ここで、bars プロパティの配列にはさまざまな文字列が含まれます。

{property1: -1, property2: "string", bars: ["A","B","C"]}

フィルタが適用されるテンプレート ファイルは次のとおりです。

<select [(ngModel)]="barFilter" class="form-control">
    <option *ngFor="let bar of barList" [value]="bar">{{bar}}</option>
</select>    
<table class="table">
            <thead>
                <tr>
                    <th>Property1 Name </th>
                    <th>Property2 Name</th>
                    <th>Bars</th>
                </tr>
            </thead>
            <tbody>
                <tr *ngFor="let item of Foos | barFilterPipe : barFilter" [foofoo]="item"></tr>
            </tbody>
        </table>

そのテンプレートをロードしてフィルターを使用する Angular クラスを次に示します。

import {Component, OnInit} from '@angular/core';
import {Foo} from '../foo';
import { BarFilterPipe } from '../Pipes/BarFilterPipe';

@Component({
    selector: 'my-component',
    templateUrl: '../components/myComponent.html',
    directives: [foofoo],
    pipes: [BarFilterPipe]
})
export class MyComponent implements OnInit {
    private barFilter: string;
    private barList: string[];
    private Foos: Foo[] = [{property1: -1, property2: "a", bars: ["A"]}, {property1: -1, property2: "z", bars: ["A","D"]}];
    constructor(){}
    ngOnInit(){
        this.barList = ["","A","B","C","D","E"];
    }
}

Foo テンプレートとクラスは次のとおりです。

<td>
    <h2>{{thisFoo.property1}}</h2>
</td>
<td>
    {{thisFoo.property2}} &nbsp;
</td>
<td>
    <label *ngFor="let bar of thisFoo.bars">{{bar}} &nbsp;</label>
</td>

import {Component, Input} from '@angular/core';
import {Foo} from './foo';

@Component({
    selector: '[foofoo]',
    templateUrl: '../components/foofooComponent.html',
})

export class EstabSummary {
    @Input('foofoo') thisFoo;

}

行にブレークポイントを設定すると、console.log(results);コンソールで次のように入力でき、適切なデータが出力されます。

let results = allFoo.filter(afoo => {afoo.bars.indexOf(bar);})

これを解決するのに役立つ場合は、トランスパイルされた JS を投稿できます。

ありがとう!

4

1 に答える 1

2

関数は、配列要素を含めるためにブール値を返しませfilterん。私はそれがあるべきだと思う:return afoo.bars.indexOf(bar) !== -1;

今のままでは、あらゆる要素が除外されます。

于 2016-09-12T10:40:03.183 に答える