my-lib/grid/grid.ts
changeDetection | ChangeDetectionStrategy.OnPush |
encapsulation | ViewEncapsulation.None |
selector | [grid],grid |
styleUrls | grid.less, |
templateUrl | ./grid.html |
Properties |
Methods |
Inputs |
Accessors |
constructor(ele: ElementRef, render: Renderer2)
|
||||||||||||
Defined in my-lib/grid/grid.ts:80
|
||||||||||||
Parameters :
|
activeClassName
|
Type: |
Defined in my-lib/grid/grid.ts:66
|
activeStyle
|
Type: |
Defined in my-lib/grid/grid.ts:61
|
carouselMaxRow
|
Type: |
Defined in my-lib/grid/grid.ts:44
|
columnNum
|
Type: |
Defined in my-lib/grid/grid.ts:31
|
data
|
Type: |
Defined in my-lib/grid/grid.ts:21
|
hasLine
|
|
Defined in my-lib/grid/grid.ts:49
|
isCarousel
|
Type:
Default value: |
Defined in my-lib/grid/grid.ts:39
|
itemStyle
|
|
Defined in my-lib/grid/grid.ts:75
|
square
|
Type: |
Defined in my-lib/grid/grid.ts:55
|
Private _splice |
_splice()
|
Defined in my-lib/grid/grid.ts:88
|
Returns :
void
|
Private getRows | ||||||||||||
getRows(rowCount: , dataLength: )
|
||||||||||||
Defined in my-lib/grid/grid.ts:104
|
||||||||||||
Parameters :
Returns :
void
|
_activeClassName |
_activeClassName:
|
Type : string
|
Default value : ''
|
Defined in my-lib/grid/grid.ts:64
|
_carouselMaxRow |
_carouselMaxRow:
|
Type : number
|
Default value : 2
|
Defined in my-lib/grid/grid.ts:42
|
_columnNum |
_columnNum:
|
Type : number
|
Default value : 4
|
Defined in my-lib/grid/grid.ts:29
|
_data |
_data:
|
Type : any[]
|
Default value : []
|
Defined in my-lib/grid/grid.ts:19
|
_itemStyle |
_itemStyle:
|
Type : any
|
Defined in my-lib/grid/grid.ts:73
|
groups |
groups:
|
Type : any[]
|
Default value : []
|
Defined in my-lib/grid/grid.ts:16
|
tpl |
tpl:
|
Type : TemplateRef<any>
|
Decorators : ContentChild
|
Defined in my-lib/grid/grid.ts:17
|
data |
setdata(val: [])
|
Defined in my-lib/grid/grid.ts:21
|
columnNum |
setcolumnNum(val: number)
|
Defined in my-lib/grid/grid.ts:31
|
carouselMaxRow |
setcarouselMaxRow(val: number)
|
Defined in my-lib/grid/grid.ts:44
|
hasLine |
sethasLine(val: )
|
Defined in my-lib/grid/grid.ts:49
|
square |
setsquare(val: any)
|
Defined in my-lib/grid/grid.ts:55
|
activeStyle |
setactiveStyle(val: boolean)
|
Defined in my-lib/grid/grid.ts:61
|
activeClassName |
getactiveClassName()
|
Defined in my-lib/grid/grid.ts:69
|
setactiveClassName(val: string)
|
Defined in my-lib/grid/grid.ts:66
|
itemStyle |
getitemStyle()
|
Defined in my-lib/grid/grid.ts:78
|
setitemStyle(val: )
|
Defined in my-lib/grid/grid.ts:75
|
import {
ViewEncapsulation, Component,
Input, ElementRef, Renderer2,
ChangeDetectionStrategy,
ContentChild, TemplateRef
} from '@angular/core';
import { Antd } from '../antd';
@Component({
selector: '[grid],grid',
templateUrl: './grid.html',
encapsulation: ViewEncapsulation.None,
changeDetection: ChangeDetectionStrategy.OnPush,
styleUrls: ['./grid.less', './patch.less']
})
export class GridComponent extends Antd {
groups: any[] = [];
@ContentChild(TemplateRef) tpl: TemplateRef<any>;
// 传入的菜单数据
_data: any[] = [];
@Input()
set data(val: any[]) {
if (val) {
this._data = val;
this._splice();
}
}
// 列数
_columnNum: number = 4;
@Input()
set columnNum(val: number) {
if (val) {
this._columnNum = val;
this._splice();
}
}
// 是否跑马灯
@Input() isCarousel: boolean = false;
// 如果是跑马灯, 一页跑马灯需要展示的行数
_carouselMaxRow: number = 2;
@Input()
set carouselMaxRow(val: number) {
this._carouselMaxRow = val;
}
// 是否有边框
@Input()
set hasLine(val) {
this.addToClass('-line', this.isMeepoTrue(val));
}
// 每个格子是否固定为正方形
@Input()
set square(val: any) {
this.addToClass('-square', this.isMeepoTrue(val));
}
// 点击反馈的自定义样式 (设为 false 时表示禁止点击反馈)
@Input()
set activeStyle(val: boolean) { }
// 点击反馈的自定义类名
_activeClassName: string = '';
@Input()
set activeClassName(val: string) {
this._activeClassName = val;
}
get activeClassName() {
return this._activeClassName;
}
// 每个格子自定义样式
_itemStyle: any;
@Input()
set itemStyle(val: Object) {
this._itemStyle = val;
}
get itemStyle() {
return this._itemStyle;
}
constructor(
ele: ElementRef,
render: Renderer2
) {
super(ele, render, 'grid');
}
// 数据分组
private _splice() {
const columnNum = this._columnNum!;
const carouselMaxRow = this._carouselMaxRow!;
const dataLength = this._data.length;
let rowCount = Math.ceil(dataLength / columnNum);
if (this.isCarousel) {
if (rowCount % carouselMaxRow !== 0) {
rowCount = rowCount + carouselMaxRow - rowCount % carouselMaxRow;
}
const pageCount = Math.ceil(rowCount / carouselMaxRow);
this.getRows(rowCount, dataLength);
} else {
this.getRows(rowCount, dataLength);
}
}
private getRows(rowCount, dataLength) {
const columnNum = this._columnNum!;
const data = [];
for (let i = 0; i < rowCount; i++) {
const rowArr: any[] = [];
for (let j = 0; j < columnNum; j++) {
const dataIndex = i * columnNum + j;
if (dataIndex < dataLength) {
rowArr.push({ data: this._data[dataIndex], index: dataIndex });
} else {
rowArr.push({ index: dataIndex, data: null });
}
}
data[i] = rowArr;
}
this.groups = data;
}
}
<flex *ngFor="let group of groups;index as row;" justify="center" align="stretch">
<grid-item [ngStyle]="itemStyle" [active]="activeClassName" *ngFor="let item of group;index as col;">
<ng-container *ngTemplateOutlet="tpl;context: {$implicit: item.data, index: item.index}"></ng-container>
</grid-item>
</flex>