Angular4.x 自定义搜索组件
Angular4 随笔(三) ——自定义搜索组件
1.简介
本组件主要是实现了搜索功能,主要是通过父子组件传值实现。
基本逻辑:
1.创建一个搜索组件,如:ng g component search
2.父组件调用子组件,并向子组件传入基础配置信息,如搜索框默认提示信息等。
3.搜索组件接收父组件传参,并在模板上进行配置,在html模板上定义点击事件,调用分页子组件自身一个方法
4.搜索组件定义发射器,当触发搜索按钮的点击事件时,发射通知
5.父组件模板调用搜索组件处,监听搜索组件发射方法,并调用自身组件方法,接收搜索组件发射携带的数据,执行自身业务逻辑
2.准备工作
搭建Angular4 环境,可以参考 我的博客 《Angular环境搭建》
在项目中引入bootstrap4
3.代码讲解
第一步:创建搜索组件
ng g component search
第二步:编写搜索组件模板
1 <form class="form-inline" style="float:right;margin-top:-0.7%;" ngNoForm> 2 <div class="form-group" class="pull-right"> 3 <label class="sr-only" for="exampleInputAmount"></label> 4 <div class="input-group" id="search" > 5 <input type="text" class="form-control" [(ngModel)]="search" id="exampleInputAmount" placeholder="{{placeholder}}" style="height:28px;width:80%;float:right;font-size: 14px;border-radius: 0px;"/> 6 <div class="input-group-addon" (click)="searchDataByContent()" style="border: solid 1px #e0e0e0;border-left: 0px;padding: 5px;" ><i class="fa fa-search"></i></div> 7 </div> 8 </div> 9 </form>
说明:
[(ngModel)]="search",是搜索组件定义一个属性,用来存储搜索框输入的搜索内容;
placeholder="{{placeholder}}",是搜索组件定义的一个属性,接收父组件传入的值,当搜索组件没有填写值时,默认显示父组件传入的文字;
searchDataByContent,是搜索组件自定义的一个点击事件,当搜索按钮被点击时候,这个方法被触发,想父组件发射数据;
第三步:搜索组件ts文件代码,如下:
1 import { Component, OnInit, Input, Output, EventEmitter } from '@angular/core'; 2 import { Station } from '../stationlist/stationlist.component'; 3 4 @Component({ 5 selector: 'app-search', 6 templateUrl: './search.component.html', 7 styleUrls: ['./search.component.css'] 8 }) 9 export class SearchComponent implements OnInit { 10 11 @Input() placeholder:string; 12 13 //过滤内容--过滤关键字 14 @Input() search:string; 15 //子组件传递给父组件的发射器 16 @Output() changeStation:EventEmitter<string> = new EventEmitter(); 17 18 19 constructor() { 20 } 21 22 ngOnInit() { 23 24 } 25 26 searchDataByContent(){ 27 this.changeStation.emit(this.search); 28 } 29 30 }
第四步:父组件ts文件中配置传入搜索组件配置项,如:
1 //搜索内容 2 private content:string = ""; 3 //搜索组件配置项 4 private placeholder:string = "请输入用户名称"; 5 //搜索组件字段 6 private filterField:string = "username";
说明:可以根据自己的实际需要,通过这种方式,配置配置项
第五步:父组件html模板调用子组件,代码如下:
1 <div class="content-box" > 2 <div class="row"> 3 <div class="col-md-12"> 4 <div class="card"> 5 <div class="card-header" style="line-height: 14px;background-color: #fff;font-size: 14px;"> 6 <i class="glyphicon glyphicon-flag" ></i>用户列表 7 <app-search [placeholder]="placeholder" (changeStation)="userChange($event)"></app-search> 8 </div> 9 10 11 <div class="card-body" style="font-size:14px;"> 12 <table class="table table-bordered "> 13 <thead> 14 <tr> 15 <th>序号</th> 16 <th>用户名称</th> 17 <th>邮箱</th> 18 <th>上次登录</th> 19 <th>状态</th> 20 <th>操作</th> 21 </tr> 22 </thead> 23 <tbody > 24 <tr *ngFor="let user of users,let i = index;"> 25 <td>{{(currentPage-1)*15+i+1}}</td> 26 <td>{{user.username}}</td> 27 <td>{{user.email}}</td> 28 <td>{{user.lastlogintime * 1000 | date:'yyyy-MM-dd HH:mm:ss'}}</td> 29 <td><span class="badge badge-success">已启用</span></td> 30 <td> 31 <a href="javascript:;" (click)="switchToCheckUser(user)">查看</a> 32 <a href="javascript:;" (click)="switchToEditUser(user)" style="margin-left:10px;">编辑</a> 33 <a href="javascript:;" (click)="deleteUser(user)" style="margin-left:10px;">删除</a> 34 </td> 35 </tr> 36 </tbody> 37 </table> 38 <app-pager [totalItems]="totalcounts" [currentPage]="currentPage" (pageChanges)="pageChanged($event)"></app-pager> 39 </div> 40 </div> 41 </div> 42 </div> 43 </div>
说明:
(changeStation)="userChange($event)",其中“changeStation”是搜索组件发射的发射器名字,在父组件中主要是起到监听搜索组件发射器作用,当搜索组件发射数据时,这个监听事件呗触发,调用userChange($event)这个方法;
userChange($event),这个方法是定义在父组件里面的一个方法,通过$event浏览器事件,我们可以拿到搜索组件发射过来的数据;
第六步:父组件定义监听页码变化的 userChange($event)方法,代码如下:
1 //根据搜索内容更新用户列表 2 userChange(filterContent:string){ 3 this.currentPage = 1; 4 this.content = filterContent; 5 this.sign = 2; 6 //重新获取用户列表数据 7 this.getUserData(); 8 }
4.运行截图
搜索前:
搜索后: