gpt4 book ai didi

javascript - 我自己的 Angular 2 Table 组件 - 2 种数据绑定(bind)方式

转载 作者:太空狗 更新时间:2023-10-29 18:16:43 26 4
gpt4 key购买 nike

我看到 Angular 2 对数据表的支持非常差。 DataTables对我不起作用(已知 Unresolved 问题)所以我想我会为自己写一些简单的东西。顺便说一句,我会学到一些有用的东西。我想以这种方式构建我的表:

<my-table> 
<my-table-row *ngFor="let row of rows">
<my-table-col>{{row.col1}}</my-table-col>
<my-table-col>{{row.col2}}</my-table-col>
</my-table-row>
</my-table>

所以我创建了一个具有简单过滤器输入的组件。现在,我想过滤我的表。 Angular 应该以某种方式将数据从 my-table-col(s) 分配给某个变量(也许 2way 数据绑定(bind)会有用?),然后我会使用一些由 keyup 事件触发的函数来过滤并且数据应该自动更新但我这样做不知道该怎么做。

import { Component, Input, OnInit } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { FormsModule } from '@angular/forms';

@Component({
selector: 'my-table',
template: `
<div style="width: 100%">
<div style="float: left; height: 50px; width: 100%">
Search: <input type="text" [(ngModel)]="filterValue" style="height: 30px; border: 1px solid silver"/> {{filterValue}}
</div>
<div style="float: left; width: 100%">
<table>
<ng-content></ng-content>
</table>
</div>
</div>
`
})
export class MyTableComponent {
filterValue: string;
}

@Component({
selector: 'my-table-row',
template: `
<tr><ng-content></ng-content></tr>
`
})
export class MyTableRowComponent {
}

@Component({
selector: 'my-table-col',
template: `
<td><ng-content></ng-content></td>
`
})
export class MyTableColComponent {
}

问候

最佳答案

更新 Angular 5

ngOutletContext已重命名为 ngTemplateOutletContext

另见 https://github.com/angular/angular/blob/master/CHANGELOG.md#500-beta5-2017-08-29

原创

对于您的示例,似乎没有必要为行和列创建一个新组件。

像一个简单的过滤管道

@Pipe({ name: 'filter' })
export class FilterPipe implements PipeTransform {
transform(data: any[], filter:string) {
console.log('filter', data, filter);
if(!data || !filter) {
return data;
}
return data.filter(row => row.some(col => col && col.indexOf(filter) >= 0));
}
}

还有一个像这样的表格组件

@Component({
selector: 'my-table',
template: `
<div style="width: 100%">
<div style="float: left; height: 50px; width: 100%">
Search:
<input type="text"
[(ngModel)]="filterValue"
name="filter"
style="height: 30px; border: 1px solid silver"/>
{{filterValue}}
</div>
<div style="float: left; width: 100%">
<table>
<tr *ngFor="let row of data | filter:filterValue">
<td *ngFor="let col of row let index=index">
<template [ngTemplateOutlet]="templates && templates[index]" [ngOutletContext]="{$implicit: col}"></template>
</td>
</tr>
</table>
</div>
</div>
`
})
export class MyTableComponent {
filterValue: string;
@ContentChildren(TemplateRef) templateRefs:QueryList<TemplateRef>;
@Input() data:any[];
templates:TemplateRef[];

ngAfterContentInit() {
this.templates = this.templateRefs.toArray();
}
}

它可以像这样使用

@Component({
selector: 'my-app',
template: `
<my-table [data]="data">
<template let-col>1: {{col}}</template>
<template let-col>2: {{col}}</template>
<template let-col>3: {{col}}</template>
</my-table>
`,
})
export class App {
data = [
['apple', 'orange', 'banana'],
['cat', 'dog', 'bird'],
['car', 'bicycle', 'airplane'],
];
}

其中行和列数据被传递到输入,单元格的布局传递为 <template>元素(每列一个 - 一些额外的检查可能很有用,例如检查模板数量是否 >= data 中的列数)。

关于javascript - 我自己的 Angular 2 Table 组件 - 2 种数据绑定(bind)方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41766661/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com