$ 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 项目列表页的更多相关文章

  1. 列表页url参数格式分析【求指教】

    运营对列表页url制定静态化模式,与区区观点相悖.遂请大家指教点解. 动态参数包含6个,分别是: 1认证(有机),2品类(水果),3地区(丰台),4状态(众筹中),5排序(评分),6分页 使用状态非常 ...

  2. IntelliJ IDEA 启动 自动进入项目列表,IDE启动不进入项目,IDE启动不进入上一次的项目

    1.希望IDE启动后,不进入上次使用的项目,而进入如图 2.项目很多,想着切换不方便,还得在启动打开前,点击取消,而且拖慢IDE启动的速度,所以进入这个项目列表页还是很好的. 3.设置方法 首先,任意 ...

  3. 深度解析开发项目之 02 - 使用VTMagic实现左右滑动的列表页

    深度解析开发项目之 02 - 使用VTMagic实现左右滑动的列表页 实现效果: 01 - 导入头文件 02 - 遵守代理协议 03 - 声明控制器的属性 04 - 设置声明属性的frame 05 - ...

  4. 微信小程序 项目实战(三)list 列表页 及 item 详情页

    1.项目结构 2.list 列表页 (1)数据(逻辑) list.js // pages/list/list.js Page({ /** * 页面的初始数据 */ data: { title: '加载 ...

  5. 夺命雷公狗ThinkPHP项目之----企业网站26之网站前台列表页的显示和完成分页功能

    我们用大I接收到我们get过来的栏目页的id然后通过文章的ar_cateid 来判断是不是属于该栏目下的,如果文章表ar_cateid = 栏目表的cate_id 那么就可以选出我们要查找的信息, 然 ...

  6. 夺命雷公狗ThinkPHP项目之----企业网站24之网站前台列表页面包屑导航的显示

    我们做面包屑导航的原理其实也是很简单的,我们的思路是: 首先找到该分类的id ,我们可以通过大 I来进行获取得到: 然后通过 大 D 方法让数据进入model层里面进行循环迭代查询, 当然,测试时候发 ...

  7. 夺命雷公狗ThinkPHP项目之----企业网站23之网站前台二级分类的跳转(URL跳转到列表页或产品页)

    我们现在开始做实现我们的二级菜单如何跳转到指定的列表页或者产品也呢?? 我们分享下数据库情况: 我们的数据库里提前给我们预留了一个cate_type的字段,那么我们可以让这个字段进行判断,从而遍历出指 ...

  8. 夺命雷公狗ThinkPHP项目之----企业网站18之网站配置列表页的完成

    我们点击下配置列表即可查看我们列表页的配置信息了: 其实这个最简单了,首先我们先来完成他控制器的代码: public function lists(){ $mod = M('Conf')->se ...

  9. 夺命雷公狗ThinkPHP项目之----企业网站13之文章列表页的实现(主要是分页的实现)

    列表页这个其实是比较简单的一个,直接遍历除数据即可: public function lists(){ //$mod = M("Article")->select(); // ...

随机推荐

  1. 逆FizzBuzz问题求最短序列

    问题描述 FizzBuzz问题:一个大于0的自然数能整除3,将输出“Fizz”:能整除5,将输出“Buzz”:能整除3和5,将输出“FizzBuzz”:否则输出自己. 逆FizzBuzz问题最短序列: ...

  2. java 键盘录入(Scanner)

    键盘录入(Scanner)• 键盘录入数据概述– 我们目前在写程序的时候, 数据值都是固定的, 但是实际开发中, 数据值肯定是变化的, 所以, 把数据改进为键盘录入, 提高程序的灵活性.• 如何实现键 ...

  3. python放弃篇(Django/爬虫)

    第一篇:Django系列 第二篇:爬虫系列 待续……

  4. 关于Python常见功能使用的博客收藏

    Python绘制曲面和曲面对应的等高线图: https://blog.csdn.net/weixin_40198632/article/details/78570679 python实现三维拟合 ht ...

  5. Linux学习之管道符、重定向、通配符、转义符、环境变量

    Linux学习之管道符.重定向.通配符.转义符.环境变量 1. 输入输出重定向 输入重定向是指把文件导入命令中. 输出重定向是指把原本要输出到屏幕的数据信息写入指定文件中. a 标准输入重定向(STD ...

  6. 新装的SSMS一打开就显示VS许可证过期,但VS又运行正常,解决方法。

    1.出现问题如下图: 2.解决方法 打开控制面板->程序卸载->找到Microsoft Visual Studio *** Shell(****),右击-修复. 3.修复好了,然后重启电脑 ...

  7. 移动端返回上一页,刚需!document.referrer 详解

    返回上一页,在PC端我们可以使用:history.go(-1)或者history.back(),可以正常返回第一层.这样,我们不需要上一页的 url 具体是什么,只要使用 history 一般都没啥问 ...

  8. mina statemachine解读(一)

      statemachine(状态机)在维护多状态数据时有非常好的作用,现在github上star排名最前的是squirrel-foundation以及spring-statemachine,而min ...

  9. FATAL ERROR: please install the following Perl modules before executing

    运行安装mysql 报错 [root@localhost mysql-mult]# ./scripts/mysql_install_db  --defaults-file=conf/3306my.cn ...

  10. recurrent model for visual attention

    paper url: https://papers.nips.cc/paper/5542-recurrent-models-of-visual-attention.pdf year: 2014 abs ...