Angular2 Material2 封装组件 —— 多选组件

环境:

Angular 4.0.0
Angular2 Material2 2.0.0-beta.3
node v7.4.0
npm 4.0.5

1.多选列表组件

1)定义组件

multiple.component.ts
import { Component, OnInit, HostListener, Input } from '@angular/core';


@Component({
    selector: 'multiple',
    templateUrl: 'multiple.component.html',
    styleUrls: ['_multiple.component.scss']
})

export class MultipleComponent implements OnInit {

    @Input() items: any = {};
    @Input() colsTitle: any;
    @Input() keyArray: any;
    @Input() assignFilterItem: string;

    constructor() {
    }

    public ngOnInit() {
        this.keyArray = this.keyArray.split(",");
        this.colsTitle = this.colsTitle.split(",");
    }

    // 设置全选状态
    private setSelectedAll = function() {
        // 全选
        let data = this.items;
        let count = 0;
        for (let i in data) {
            if (data[i].checked) {
                count++;
            }
        }

        if (count === data.length) {
            this.slideToggleModel = true;
        } else {
            this.slideToggleModel = false;
        }
    }

    // 选中,反选
    onToggle(item) {
        item.checked = !item.checked;

        this.setSelectedAll();
    }

    // 在已选项列表中取消选中
    cancleSelected(item) {
        item.checked = false;

        this.setSelectedAll();
    }

    // 全选
    selectAll(checked) {

        var data = this.items;

        if (checked) {
            for (var i in data) {
                data[i].checked = true;
            }
        } else {
            for (var i in data) {
                data[i].checked = false;
            }
        }
    }

}
multiple.component.html
<div class="clearfix">
    <div class="col-md-12">
        <md-input-container>
            <input mdInput placeholder="请键入筛选项..." value="" [(ngModel)]="searchText"></md-input-container>
    </div>

    <div class="col-md-12 multiple-data-list">
        <md-grid-list [cols]=colsTitle.length+1 rowHeight="35px">
            <md-grid-tile>
                <md-slide-toggle (change)="selectAll(slideToggleModel)" [(ngModel)]="slideToggleModel" [checked]="slideToggleModel">全选</md-slide-toggle>
            </md-grid-tile>
            <md-grid-tile class="text-center" *ngFor="let title of colsTitle">
                <h3>{{title}}</h3>
            </md-grid-tile>
            <div *ngFor="let item of items | searchTextFilter: [searchText, assignFilterItem]">
                <md-grid-tile>
                    <md-checkbox (change)="onToggle(item)" [checked]="item.checked"></md-checkbox>
                </md-grid-tile>
                <md-grid-tile *ngFor="let key of keyArray">{{item[key]}}</md-grid-tile>
            </div>
        </md-grid-list>
    </div>
    <div class="col-md-12">
        <h2 class="multiple-title">已选项</h2>
        <div class="multiple-selected">
            <div class="multiple-selected-item" *ngFor="let item of items">
                <md-chip *ngIf="item.checked" [selected]="item.checked"  class="chip-item" hover (click)="cancleSelected(item)">
                    <span class="chip-item-label">{{item[assignFilterItem]}}</span> <i class="icon-close-cyan selectedItem-close"></i>
                </md-chip>
            </div>
        </div>
    </div>
</div>

2)使用方法

在标签<multiple></multiple>设置相应属性

属性 描述
items 数据源
colsTitle string,列表的表头。eg. colsTitle="Title,Name"
keyArray string,列表的列项内容属性。eg. keyArray="title,name"
assignFilterItem <ol><li>string, searchText筛选的属性。<br />eg.数据源的属性为:title,name,number 假设输入searchText需要筛选的是Title,则assignFilterItem="title";</li><li>已选项展示的值,assignFilterItem="title", 即设置已选项展示的数据是title的值。</li></ol>

3)例子

multiple-example.component.html
<multiple [items]="listData" colsTitle="Title" keyArray="title" assignFilterItem="title"></multiple>
效果图:
多选列表Example

2.简单版多选列表组件

逻辑上,跟1.多选列表组件其实是类似的。就是使用上有区别。

1)定义组件

multipleSimple.component.ts
import { Component, OnInit, HostListener, Input } from '@angular/core';

@Component({
    selector: 'multipleSimple',
    templateUrl: 'multipleSimple.component.html',
    styleUrls: ['_multiple.component.scss']
})

export class MultipleSimpleComponent implements OnInit {

    public ngOnInit() { }

    @Input() items: any = {};
    @Input() assignFilterItem: string;
    slideToggleModel: boolean;

    // 设置全选状态
    private setSelectedAll = function() {
        // 全选
        let data = this.items;
        let count = 0;
        for (let i in data) {
            if (data[i].selected) {
                count++;
            }
        }

        if (count === data.length) {
            this.slideToggleModel = true;
        } else {
            this.slideToggleModel = false;
        }
    }

    // 选中,反选
    onToggle(item) {
        item.selected = !item.selected;

        this.setSelectedAll();
    }

    // 在已选项列表中取消选中
    cancleSelected(item) {
        item.selected = false;

        this.setSelectedAll();
    }
    
    // 全选
    selectAll(checked) {
        var data = this.items;

        if (checked) {
            for (var i in data) {
                data[i].selected = true;
            }
        } else {
            for (var i in data) {
                data[i].selected = false;
            }
        }
    }
}

multipleSimple.component.html
<div class="clearfix">
    <div class="col-md-12">
        <md-input-container>
            <input mdInput placeholder="请键入筛选项..." value="" [(ngModel)]="searchText"></md-input-container>
        <md-slide-toggle (change)="selectAll(slideToggleModel)" [(ngModel)]="slideToggleModel" [checked]="slideToggleModel">全选</md-slide-toggle>
    </div>

    <div class="col-md-2">
        <h3 class="multiple-title">请选择</h3>
        <md-list>
            <md-list-item *ngFor="let item of items | searchTextFilter: [searchText,assignFilterItem]">
                <md-chip-list>
                    <md-chip class="chip-item-unselect" [selected]="item.selected" (click)="onToggle(item)">{{item[assignFilterItem]}}</md-chip>
                </md-chip-list>
            </md-list-item>
        </md-list>
    </div>
    <div class="col-md-3">
        <h3 class="multiple-title">已选项</h3>
        <md-list>
            <span *ngFor="let item of items">
                <md-chip *ngIf="item.selected" [selected]="item.selected"  class="chip-item" hover (click)="cancleSelected(item)">
                    <span class="chip-item-label">{{item[assignFilterItem]}}</span> <i class="icon-close-cyan selectedItem-close"></i>
                </md-chip>
            </span>
        </md-list>
    </div>
</div>

2)使用方法

在标签<multipleSimple></multipleSimple>设置相应属性

属性 描述
items 数据源
assignFilterItem <ol><li>string, searchText筛选的属性。<br />eg.数据源的属性为:title,name,number 假设输入searchText需要筛选的是Title,则assignFilterItem="title";</li><li>列表的列项内容属性</li><li>已选项展示的值,assignFilterItem="title", 即设置已选项展示的数据是title的值。</li></ol>

3)例子

multiple-example.component.html
<multipleSimple [items]="datas" assignFilterItem="title"></multipleSimple>
效果图:
简单多选列表Example

3.多选Dialog

1)定义组件

multipleDialog.component.ts
import { Component, OnInit, Inject } from '@angular/core';
import { MdDialogRef } from '@angular/material';
import { MD_DIALOG_DATA } from '@angular/material';



@Component({
    selector: 'multiple-dialog',
    styleUrls: ['_multiple.component.scss'],
    templateUrl: 'multipleDialog.component.html'
})

export class MultipleDialogComponent implements OnInit {
    config: {};
    slideToggleModel: boolean;
    constructor(private mdDialogRef: MdDialogRef<MultipleDialogComponent>, @Inject(MD_DIALOG_DATA) data: any) {
        this.config = data;
        this.setSelectedAll();
    }

    // 设置全选状态
    private setSelectedAll = function() {
        // 全选
        let data = this.config.content;
        let count = 0;
        for (let i in data) {
            if (data[i].checked) {
                count++;
            }
        }

        if (count === data.length) {
            this.slideToggleModel = true;
        } else {
            this.slideToggleModel = false;
        }
    }
    public ngOnInit() {

    }

    // 选中,反选
    onToggle(item) {
        item.checked = !item.checked;

        this.setSelectedAll();
    }

    // 在已选项列表中取消选中
    cancleSelected(item) {
        item.checked = false;

        this.setSelectedAll();
    }

    // 全选
    selectAll(checked) {
        let data: any = this.config;
        let dataContent: any = data.content;
        console.log(dataContent);
        if (checked) {
            for (let i in dataContent) {
                dataContent[i].checked = true;
            }
        } else {
            for (let i in dataContent) {
                dataContent[i].checked = false;
            }
        }
    }
}
multipleDialog.component.html
<div md-dialog-title>
    <md-input-container>
        <input mdInput placeholder="请键入筛选项..." value="" [(ngModel)]="searchText"></md-input-container>
    <span class="icon-close-mid pull-right md-dialog-title-close" (click)="mdDialogRef.close()"></span>
</div>
<div md-dialog-content class="multiple-dialog-contentContainer">
    <div class="col-md-12 multiple-data-list">
        <md-grid-list [cols]=config.colsTitle.length+1 rowHeight="35px">
            <md-grid-tile>
                <md-slide-toggle (change)="selectAll(slideToggleModel)" [(ngModel)]="slideToggleModel" [checked]="slideToggleModel">全选</md-slide-toggle>
            </md-grid-tile>
            <md-grid-tile class="text-center" *ngFor="let title of config.colsTitle">{{title}}</md-grid-tile>
            <div *ngFor="let item of config.content | searchTextFilter: [searchText, config.assignFilterItem]">
                <md-grid-tile>
                    <md-checkbox (change)="onToggle(item)" [checked]="item.checked"></md-checkbox>
                </md-grid-tile>
                <md-grid-tile *ngFor="let key of config.keyArrayName">{{item[key]}}</md-grid-tile>
            </div>
        </md-grid-list>
    </div>
    <div class="col-md-12">
        <h2 class="multiple-title">已选项</h2>
        <div class="multiple-selected">
            <div class="multiple-selected-item" *ngFor="let item of config.content">
                <md-chip *ngIf="item.checked" [selected]="item.checked"  class="chip-item" hover (click)="cancleSelected(item)">
                    <span class="chip-item-label">{{item[config.assignFilterItem]}}</span> <i class="icon-close-cyan selectedItem-close"></i>
                </md-chip>
            </div>
        </div>
    </div>

</div>
<div md-dialog-actions class="multiple-dialog-actionsContainer">
    <md-slide-toggle (change)="selectAll(slideToggleModel)" [(ngModel)]="slideToggleModel" [checked]="slideToggleModel">全选</md-slide-toggle>
    <div class="multiple-dialog-operate">
        <button md-raised-button color="primary" (click)="mdDialogRef.close()">确定</button>
        <button md-raised-button md-dialog-close class="multiple-dialog-cancel">取消</button>
    </div>
</div>

2)把组件注入到服务

为了通用,把组件注入服务,方便在其他地方使用。这样的话,就不用在每次使用的时候重新定义组件。

multipleDialog.service.ts
import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
import { MdDialog, MdDialogRef, MdDialogConfig } from '@angular/material';
import { MultipleDialogComponent } from './multipleDialog.component';
import { Observable } from 'rxjs/Observable';


export class MultipleDialogService {
    constructor( @Inject(MdDialog) public _multipleDialog: MdDialog, @Inject(DOCUMENT) doc: any) {
        _multipleDialog.afterOpen.subscribe((ref: MdDialogRef<any>) => {
            if (!doc.body.classList.contains('no-scroll')) {
                doc.body.classList.add('no-scroll');
            }
        });
        _multipleDialog.afterAllClosed.subscribe(() => {
            doc.body.classList.remove('no-scroll');
        });


    }

    public setMultipleData(contentOrConfig: any, title?: string): Observable<any> {
        let config = new MdDialogConfig();
        config = {
            width: '700px'
        };
        if (contentOrConfig instanceof Object) {
            config.data = contentOrConfig;
        } else if ((typeof contentOrConfig) === 'string') {
            config.data = {
                content: contentOrConfig,
                title: title
            }
        }
        return this._multipleDialog.open(MultipleDialogComponent, config).afterClosed();
    }
}

3)使用方法

  • Step1:在标签中添加方法,并传入参数
属性 描述
arg1 Array,列表的表头。eg. ['Title']
arg2 Array,列表的列项内容的属性。eg. ['title']
arg3 <ol><li>string, searchText筛选的属性。<br />eg.数据源的属性为:title,name,number 假设输入searchText需要筛选的是Title,则assignFilterItem="title";</li><li>已选项展示的值,即设置已选项展示的数据是title的值。</li></ol>
  • Step2:在需要使用的组件里的provides注册并定义相应的方法

4)例子

multiple-example.component.html
<button md-raised-button (click)="openDialog(['Title'], ['title'],'title')">Open dialog</button>
multiple-example.component.ts
import { Component, OnInit, HostListener } from '@angular/core';
import { MultipleDialogService } from './multipleDialog.service';

@Component({
    selector: 'multipleExample',
    templateUrl: 'multiple-example.component.html',
    styleUrls: ['multiple-example.component.css'],
    providers: [MultipleDialogService]
})

export class MultipleExampleComponent implements OnInit {

    public constructor(public _multipleDialogService: MultipleDialogService) { }
    public ngOnInit() { }

    listData = [{ title: '森美', name: '1' }, { title: '小仪' }, { title: '西瓜' }, { title: '阿杰' }];

    // 多选框
    public openDialog(titleArray, keyArray, assignFilterItemName) {
        this._multipleDialogService.setMultipleData({ content: this.listData, colsTitle: titleArray, keyArrayName: keyArray, assignFilterItem: assignFilterItemName }).subscribe(res => {

            // 返回结果
            let selectedArr = [];
            let data: any = this.listData;
            for (let i in data) {
                if (data[i].checked) {
                    selectedArr.push(data[i]);
                }
            }

        });
    }
}
效果图:
多选Dialog Example

4.简单多选Dialog

逻辑上,跟3.多选Dialog组件其实是类似的。只是简单版

1)定义组件

multipleSimpleDialog..component.ts
import { Component, OnInit, Inject } from '@angular/core';
import { MdDialogRef } from '@angular/material';
import { MD_DIALOG_DATA } from '@angular/material';


@Component({
    selector: 'multiple-dialog',
    styleUrls: ['_multiple.component.scss'],
    templateUrl: 'multipleSimpleDialog.component.html'
})

export class MultipleSimpleDialogComponent implements OnInit {
    config: {};
    slideToggleModel: boolean;
    constructor(private mdDialogRef: MdDialogRef<MultipleSimpleDialogComponent>, @Inject(MD_DIALOG_DATA) data: any) {
        this.config = data;
        this.setSelectedAll();
    }

    // 设置全选状态
    private setSelectedAll = function() {
        // 全选
        let data = this.config.content;
        let count = 0;
        for (let i in data) {
            if (data[i].selected) {
                count++;
            }
        }

        if (count === data.length) {
            this.slideToggleModel = true;
        } else {
            this.slideToggleModel = false;
        }
    }
    public ngOnInit() {

    }

    // 选中,反选
    onToggle(item) {
        item.selected = !item.selected;

        this.setSelectedAll();
    }

    // 在已选项列表中取消选中
    cancleSelected(item) {
        item.selected = false;

        this.setSelectedAll();
    }

    // 全选
    selectAll(checked) {
        let data: any = this.config;
        let dataContent: any = data.content;

        if (checked) {
            for (let i in dataContent) {
                dataContent[i].selected = true;
            }
        } else {
            for (let i in dataContent) {
                dataContent[i].selected = false;
            }
        }
    }
}
multipleSimpleDialog.component.html
<div md-dialog-title>
    <md-input-container>
        <input mdInput placeholder="请键入筛选项..." value="" [(ngModel)]="searchText"></md-input-container>
    <span class="icon-close-mid pull-right md-dialog-title-close" (click)="mdDialogRef.close()"></span>
</div>
<div md-dialog-content class="multiple-dialog-contentContainer">
    <div class="col-md-6">
        <h3 class="multiple-title">请选择</h3>
        <md-list>
            <md-list-item *ngFor="let item of config.content | searchTextFilter: [searchText,config.assignFilterItem]">
                <md-chip-list>
                    <md-chip class="chip-item-unselect" [selected]="item.selected" (click)="onToggle(item)">{{item[config.assignFilterItem]}}</md-chip>
                </md-chip-list>
            </md-list-item>
        </md-list>
    </div>
    <div class="col-md-6">
        <h3 class="multiple-title">已选项</h3>
        <md-list>
            <span *ngFor="let item of config.content">
                <md-chip *ngIf="item.selected" [selected]="item.selected"  class="chip-item" hover (click)="cancleSelected(item)">
                    <span class="chip-item-label">{{item[config.assignFilterItem]}}</span> <i class="icon-close-cyan selectedItem-close" (click)="cancleSelected(item)"></i>
                </md-chip>
            </span>
        </md-list>
    </div>
</div>
<div md-dialog-actions class="multiple-dialog-actionsContainer">
    <md-slide-toggle (change)="selectAll(slideToggleModel)" [(ngModel)]="slideToggleModel" [checked]="slideToggleModel">全选</md-slide-toggle>
    <div class="multiple-dialog-operate">
        <button md-raised-button color="primary" (click)="mdDialogRef.close()">{{ config.button || '确定' }}</button>
        <button md-raised-button md-dialog-close class="multiple-dialog-cancel">取消</button>
    </div>
</div>

2)把组件注入到服务

为了通用,把组件注入服务,方便在其他地方使用。这样的话,就不用在每次使用的时候重新定义组件。

multipleSimpleDialog.service.ts
import { Component, Inject } from '@angular/core';
import { DOCUMENT } from '@angular/platform-browser';
import { MdDialog, MdDialogRef, MdDialogConfig } from '@angular/material';
import { MultipleSimpleDialogComponent } from './multipleSimpleDialog.component';
import { Observable } from 'rxjs/Observable';


export class MultipleSimpleDialogService {
    constructor( @Inject(MdDialog) public _multipleDialog: MdDialog, @Inject(DOCUMENT) doc: any) {
        _multipleDialog.afterOpen.subscribe((ref: MdDialogRef<any>) => {
            if (!doc.body.classList.contains('no-scroll')) {
                doc.body.classList.add('no-scroll');
            }
        });
        _multipleDialog.afterAllClosed.subscribe(() => {
            doc.body.classList.remove('no-scroll');
        });
    }

    public setMultipleData(contentOrConfig: any, title?: string): Observable<any> {
        let config = new MdDialogConfig();
        config = {
            width: '700px'
        };
        if (contentOrConfig instanceof Object) {
            config.data = contentOrConfig;
        } else if ((typeof contentOrConfig) === 'string') {
            config.data = {
                content: contentOrConfig,
                title: title
            }
        }
        return this._multipleDialog.open(MultipleSimpleDialogComponent, config).afterClosed();
    }
}

3)使用方法

  • Step1:在标签中添加方法,并传入参数
属性 描述
arg1 <ol><li>string, searchText筛选的属性。<br />eg.数据源的属性为:title,name,number 假设输入searchText需要筛选的是Title,则assignFilterItem="title";</li><li>列表的内容</li><li>已选项展示的值,即设置已选项展示的数据是title的值。</li></ol>
  • Step2:在需要使用的组件里的provides注册并定义相应的方法

4)例子

multiple-example.component.html
<button md-raised-button (click)="openSimpleDialog('title')">Open Simple dialog</button>
multiple-example.component.ts
import { Component, OnInit, HostListener } from '@angular/core';
import { MultipleSimpleDialogService } from './multipleSimpleDialog.service';

@Component({
    selector: 'multipleExample',
    templateUrl: 'multiple-example.component.html',
    styleUrls: ['multiple-example.component.css'],
    providers: [MultipleSimpleDialogService]
})

export class MultipleExampleComponent implements OnInit {

    public constructor(public _multipleSimpleDialogService: MultipleSimpleDialogService) { }
    public ngOnInit() { }

    datas = [{ title: '你', name: '1' }, { title: 'Banana' }, { title: 'Cat' }, { title: 'Dog', name: '1' }, { title: 'Egg' }, { title: 'Food' }, { title: 'Girl', name: '1' }, { title: 'Hello' }, { title: 'In' }];

    // 简单多选框
    public openSimpleDialog(assignFilterItemName) {
        this._multipleSimpleDialogService.setMultipleData({ content: this.datas, assignFilterItem: assignFilterItemName }).subscribe(res => {

            // 返回结果
            let selectedArr = [];
            let data: any = this.datas;
            for (let i in data) {
                if (data[i].selected) {
                    selectedArr.push(data[i]);
                }
            }

            // console.log(selectedArr);

        });
    }

效果图:
简单多选Dialog Example

详细的源码,请看!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,100评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 170,569评论 25 707
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,088评论 2 44
  • 今天的推送,依旧是国庆特别策划之“假日里的七宗罪”,又名“你不好意思骂的,我们帮你骂”系列。 这里的虚荣,是指一种...
    网易王三三阅读 1,365评论 0 25
  • 男女老少众人爱 润肠减肥兼补钙 助眠制造血清素 勿空腹食更愉快
    溪水音阅读 236评论 2 4