【发布时间】:2016-04-16 15:13:34
【问题描述】:
我有下面的代码,它工作正常,它的作用是 ngFor repeat 为列对象中的每一列创建一个列。
目前它在每一列中显示卡片对象中的每张卡片。
我想要它做的是只在 WHERE column.id = card.column 列中显示卡片
如何修改我的代码来做到这一点?
import {Input, Output, EventEmitter, Component, Injectable} from 'angular2/core'
import {NgFor} from 'angular2/common'
import {Observable} from 'rxjs/Observable';
interface Card {
id?: number;
title?: string;
column?: number;
}
@Injectable()
export class DataService {
cards$: Observable<Array<Card>>;
private _cardsObserver: any;
private _dataStore: Array<Card>;
constructor(){
this._dataStore = [
{id: 1, title: 'Card A', column: 1},
{id: 2, title: 'Card B', column: 2},
{id: 3, title: 'Card C', column: 2}
];
this.cards$ = new Observable(observer =>
this._cardsObserver = observer).share();
}
loadCards() {
this._cardsObserver.next(this._dataStore);
}
addCard(){
this._dataStore.push({id: 4, title: 'Card D', column: 3});
this._cardsObserver.next(this._dataStore);
}
getColumns(){
var columns = [
{id: 1, title: 'Column One'},
{id: 2, title: 'Column Two'},
{id: 3, title: 'Column Three'}
];
return columns;
}
}
@Component({
selector: 'app',
providers: [DataService],
directives: [],
template: `
<button (click)="dataService.addCard()">Add Card</button>
<div class="columns" *ngFor="#c of columns">
{{c.title}}
<div class="card" *ngFor="#card of cards">{{card.title}}</div>
</div>
`
})
export class App {
private cards: Array<Card>;
private columns: any;
constructor(public dataService: DataService) {
dataService.cards$.subscribe(updatedCards => this.cards = updatedCards);
dataService.loadCards();
this.columns = dataService.getColumns();
}
}
【问题讨论】:
-
product.column?你是说卡吗?这是你想要的? :angular.io/docs/js/latest/api/common/NgIf-directive.html
-
没错,card.column。
-
无需过多修改您的示例,您可以添加类似
*ngIf="card.colum == column.id"的内容或使用管道在 ngFor angular.io/docs/ts/latest/api/common/SlicePipe-class.html 中过滤它们,但您可能需要重新格式化您的数据结构以在更多高效的方式,因此您不必为每列迭代所有这些 -
你可以在 Observable 上使用
.filter(card => card.id === card.column),在.share()之前的服务中或在.subscribe()之前的组件中 -
不要将卡片保留在您的服务中,要么返回它们,要么返回它们的可观察对象或承诺,并将它们设置为控制器中的属性。您的逻辑现在太复杂了,难以理解、排除故障和维护,如果您像这样更改它并使用您的示例上传 repo 或 codepen/plunkr,我相信您会更快地获得帮助。
标签: angular