Angular 项目列表页
$ ng g m project
功能:项目列表显示,增加,修改,删除项目。邀请其它人员加入项目。
单一性原则:希望搭建多个组件,每个组件负责自己的功能。
一、project相关组件
$ ng g c project/project-list 【项目列表组件】
$ ng g c project/project-item 【卡片组件】
$ ng g c project/new-project【新建项目组件,新建项目,或者修改项目时候会有一个对话框。】
$ ng g c project/invite 【邀请组件,邀请其它成员的对话框。】
此时这些组件都会在declarations中。
declarations: [ProjectListComponent, ProjectItemComponent, NewProjectComponent, InviteComponent],
我们希望对话框组件出现在entryComponent中。
import { NgModule } from '@angular/core';
import { SharedModule } from '../shared/shared.module';
import { ProjectListComponent } from './project-list/project-list.component';
import { ProjectItemComponent } from './project-item/project-item.component';
import { NewProjectComponent } from './new-project/new-project.component';
import { InviteComponent } from './invite/invite.component';
import { ProjectRoutingModule } from './project-routing.module';
@NgModule({
declarations: [ProjectListComponent, ProjectItemComponent, NewProjectComponent, InviteComponent],
entryComponents: [NewProjectComponent, InviteComponent],
imports: [
SharedModule,
ProjectRoutingModule
]
})
export class ProjectModule { }
二、ProjectList
循环输出每个项目的item,有一个新增项目item的快速响应的按钮。
<app-project-item *ngFor="let project of projects" [item]="project">
</app-project-item>
<button mad-fab type="button" (click)="openNewProjectDialog()">
<mat-icon>add</mat-icon>
</button>
project-item里的内容应该是projectList项目决定的。
export class ProjectListComponent implements OnInit {
projects = [
{
"name": "企业协作平台",
"desc": "这是一个企业内部项目",
"coverImg": "assets/images/covers/0.jpg"
},
{
"name": "自动化测试项目",
"desc": "这是一个企业内部项目",
"coverImg": "assets/images/covers/2.jpg"
}
];
constructor(private dialog: MatDialog) { }
ngOnInit() {
}
openNewProjectDialog() {
this.dialog.open(NewProjectComponent);
}
}
三、ProjectItem
应该是卡片类型的。
<mat-card class="example-card">
<mat-card-header>
<mat-card-title>每日佳句</mat-card-title> </mat-card-header>
<img mat-card-image [src]="item.coverImg" alt="项目封面">
<mat-card-content>
{{item.desc}}
</mat-card-content>
<mat-card-actions>
<button>
<mat-icon>note</mat-icon>
<span>编辑</span>
</button>
<button>
<mat-icon>group_add</mat-icon>
<span>邀请</span>
</button>
<button>
<mat-icon>delete</mat-icon>
<span>删除</span>
</button>
</mat-card-actions>
</mat-card>
1、邀请
希望这个组件越笨越好,只显示,不做逻辑处理。
所以projectItem中点击 邀请 按钮,只负责把事件发射出去,让父组件知道,不做处理。
<button mat-button type="button" (click)="onInviteClick()">
<mat-icon>group_add</mat-icon>
<span>邀请</span>
</button> @Output() onInvite = new EventEmitter<void>();
onInviteClick() {
this.onInvite.emit();
}
2、编辑
编辑和新建共用一套组件。
ListItem把编辑事件发射出去。
<button mat-button type="button" (click)="onEditClick()">
<mat-icon>note</mat-icon>
<span>编辑</span>
</button> @Output() onEdit = new EventEmitter<void>();
onEditClick() {
this.onEdit.emit();
}
ProjectList得到编辑事件后lauch新建项目组件,传入title。
<app-project-item *ngFor="let project of projects" [item]="project"
class="card"
(onInvite)="lauchInviteDialog()"
(onEdit)="lauchUpdateDialog()">
</app-project-item> lauchUpdateDialog() {
const dialogRef = this.dialog.open(NewProjectComponent, {
data: { title: '编辑项目' }
});
}
NewProject组件中处理新建和编辑。
import { Component, OnInit, Inject } from '@angular/core';
import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material';
import { OverlayContainer } from '@angular/cdk/overlay';
@Component({
selector: 'app-new-project',
templateUrl: './new-project.component.html',
styleUrls: ['./new-project.component.scss']
})
export class NewProjectComponent implements OnInit {
title = '';
theme: string = 'myapp-dark-theme';
constructor(@Inject(MAT_DIALOG_DATA) private data: any,
public dialogRef: MatDialogRef<NewProjectComponent>,
private oc: OverlayContainer) { }
ngOnInit() {
console.log(JSON.stringify(this.data));
this.title = this.data.title;
// this.oc.themeClass = this.data.dark ? 'myapp-dark-theme' : 'null';
this.oc.getContainerElement().classList.add(this.theme);
}
onSave() {
this.dialogRef.close('I received your message');
}
}
3,删除
前面过程一样,在Project List中lauch确认对话框
<app-project-item *ngFor="let project of projects" [item]="project"
class="card"
(onInvite)="lauchInviteDialog()"
(onEdit)="lauchUpdateDialog()"
(onDelete)="lauchConfimDialog()">
</app-project-item> lauchConfimDialog() {
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
data: { title: '编辑项目', content: '您确认删除该项目吗?' }
});
}
三、路由
{
path: '', redirectTo: '/login', pathMatch: 'full'
},
{
path:'login',loadChildren:'./login/login.module#LoginModule'
},
{
path:'project',loadChildren:'./project/project.module#ProjectModule'
}
];
四、NewProject
<form>
<h2 md-dialog-title>新建项目</h2>
<div mat-dialog-content>
<mat-form-field class="example-full-width" class="full-width">
<input type="text" matInput placeholder="您的email" style="text-align: right">
</mat-form-field>
<mat-form-field class="example-full-width" class="full-width">
<input type="password" matInput placeholder="您的密码" style="text-align: right">
</mat-form-field>
</div>
<div mat-dialog-actions>
<button type="button" mat-raised-button color="primary">保存</button>
<button type="button" mat-button mat-dialog-close>关闭</button>
</div>
</form>
五、Invite
用AutoComplete完成邀请组员的布局。
<form>
<h2 md-dialog-title>邀请组员:</h2>
<div mat-dialog-content>
<mat-form-field class="example-full-width" class="full-width">
<input type="text" matInput placeholder="组员姓名" [matAutocomplete]="autoMembers" >
<mat-autocomplete #autoMembers="matAutocomplete" [displayWith]="displayUser">
<mat-option *ngFor="let option of filteredOptions" [value]="option">
{{option.name}}
</mat-option>
</mat-autocomplete>
</mat-form-field> </div>
<div mat-dialog-actions>
<button type="button" mat-raised-button color="primary" (click)="onSave()">保存</button>
<button type="button" mat-button mat-dialog-close>关闭</button>
</div>
</form>
displayUser(user: { id: string; name: string }) {
return user ? user.name : ''
}


希望这个组件越笨越好,只显示,不做逻辑处理,涉及逻辑了逻辑代码会非常分散。调试的时候更改的地方会非常多。
所以projectItem中点击 邀请 按钮,只负责把事件发射出去,让父组件知道,不做处理。
所以projectList来处理邀请事件,调起Invite组件。
lauchInviteDialog(){
const dialogRef = this.dialog.open(InviteComponent);
}
Angular 项目列表页的更多相关文章
- 列表页url参数格式分析【求指教】
运营对列表页url制定静态化模式,与区区观点相悖.遂请大家指教点解. 动态参数包含6个,分别是: 1认证(有机),2品类(水果),3地区(丰台),4状态(众筹中),5排序(评分),6分页 使用状态非常 ...
- IntelliJ IDEA 启动 自动进入项目列表,IDE启动不进入项目,IDE启动不进入上一次的项目
1.希望IDE启动后,不进入上次使用的项目,而进入如图 2.项目很多,想着切换不方便,还得在启动打开前,点击取消,而且拖慢IDE启动的速度,所以进入这个项目列表页还是很好的. 3.设置方法 首先,任意 ...
- 深度解析开发项目之 02 - 使用VTMagic实现左右滑动的列表页
深度解析开发项目之 02 - 使用VTMagic实现左右滑动的列表页 实现效果: 01 - 导入头文件 02 - 遵守代理协议 03 - 声明控制器的属性 04 - 设置声明属性的frame 05 - ...
- 微信小程序 项目实战(三)list 列表页 及 item 详情页
1.项目结构 2.list 列表页 (1)数据(逻辑) list.js // pages/list/list.js Page({ /** * 页面的初始数据 */ data: { title: '加载 ...
- 夺命雷公狗ThinkPHP项目之----企业网站26之网站前台列表页的显示和完成分页功能
我们用大I接收到我们get过来的栏目页的id然后通过文章的ar_cateid 来判断是不是属于该栏目下的,如果文章表ar_cateid = 栏目表的cate_id 那么就可以选出我们要查找的信息, 然 ...
- 夺命雷公狗ThinkPHP项目之----企业网站24之网站前台列表页面包屑导航的显示
我们做面包屑导航的原理其实也是很简单的,我们的思路是: 首先找到该分类的id ,我们可以通过大 I来进行获取得到: 然后通过 大 D 方法让数据进入model层里面进行循环迭代查询, 当然,测试时候发 ...
- 夺命雷公狗ThinkPHP项目之----企业网站23之网站前台二级分类的跳转(URL跳转到列表页或产品页)
我们现在开始做实现我们的二级菜单如何跳转到指定的列表页或者产品也呢?? 我们分享下数据库情况: 我们的数据库里提前给我们预留了一个cate_type的字段,那么我们可以让这个字段进行判断,从而遍历出指 ...
- 夺命雷公狗ThinkPHP项目之----企业网站18之网站配置列表页的完成
我们点击下配置列表即可查看我们列表页的配置信息了: 其实这个最简单了,首先我们先来完成他控制器的代码: public function lists(){ $mod = M('Conf')->se ...
- 夺命雷公狗ThinkPHP项目之----企业网站13之文章列表页的实现(主要是分页的实现)
列表页这个其实是比较简单的一个,直接遍历除数据即可: public function lists(){ //$mod = M("Article")->select(); // ...
随机推荐
- [CTSC2017]网络
[CTSC2017]网络 连一条长度为len的边,使得基环树的直径最小 结论:一定连在某条直径两个点上(否则更靠近不劣) 然后二分答案判定. dp[i]:链上一个点往下延伸的最大深度 考虑对于任意两个 ...
- 洛谷P1066 2^k进制数(题解)(递推版)
https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...
- 复选框checkbox——用背景图片替换样式
input { border : none; display : inline-block; width : 25px; height : 25px; -webkit-apearance : none ...
- 分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比
分布式协调服务Zookeeper集群监控JMX和ZkWeb应用对比 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. JMX是用来远程监控Java应用的框架,这个也可以用来监控其他的J ...
- 阅读阿里文档总结————Mysql数据库篇
一:建表规范 1.针对于任何字段如果为非负数,必须是 unsigned: 2.表达逻辑删除的字段名 is_deleted,1 表示删除,0 表示未删除: (1为是:0为否) 3.主键索引名为 pk_字 ...
- 高可用-mysql安装,双主模式+keepalived
mysql安装 1.添加用户 groupadd mysql useradd -r -g mysql mysql
- Python高级笔记(二) -- 深拷贝和浅拷贝
1. 深拷贝 1.1 类型1 注意: d没有改变, 因为d所拷贝的数据没有改变, 而是c往后添加数据. 1.2 类型2: 元组 如果copy.copy拷贝的是元组是深拷贝! 不会进行浅拷贝, 仅仅是指 ...
- H5_0003:JS禁用调试,禁用右键,监听F12事件的方法
1,禁用调试 // 这个方法是防止恶意调试的 (function () { console["log"]("=============================== ...
- 34 springboot项目之间依赖导致bean 无法加载问题
方式一(OK) 模块A引入模块B ,但是模块B的bean一直注入不进来 原因: A模块的Application是在com.xx.xx包下,那么势必只能扫描到这个包下的bean, B模块的Applica ...
- ES2015 中的函数式Mixin
原文链接:http://raganwald.com/2015/06/17/functional-mixins.html 在“原型即对象”中,我们看到可以对原型使用 Object.assign 来模拟 ...