$ 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. 关于vue-router 中参数传递的那些坑(params,query)

    1.query方式传参和接受参数 传参 this.$router.push({ path:'/xxx' query:{ idname:id } })接收的方式:this.$route.query.id ...

  2. 关于java环境变量配置出现javac命令无法运行的解决办法

    昨天一时兴起给电脑刷了机,想着给电脑装个Win10+Linux的双系统, 结果双系统没装好,所有的东西又得重新弄一遍 今天在配置java的时候又出问题了 java,java-version运行成功了, ...

  3. JMeter命令行监控CPU

    JMeter 命令行执行脚本得到的报告中,是没有CPU.内存使用率等监控数据的,我们可以使用JMeter插件帮忙. 首先,需要下载JMeterPlugins-Standard.jar,jmeter-p ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 G Spare Tire(容斥)

    https://nanti.jisuanke.com/t/31448 题意 已知a序列,给你一个n和m求小于n与m互质的数作为a序列的下标的和 分析 打表发现ai=i*(i+1). 易得前n项和为 S ...

  5. System系统类

    System系统类 : 主要的作用是用于获取系统的一个参数. System类需要掌握的方法: arraycopy(Object src, int srcPos, Object dest, int de ...

  6. javascript 事件冒泡和事件代理

    事件冒泡 简单的讲,当子元素的事件处理函数被触发(如onclick),该事件会从事件源(当前子元素)逐级向上层元素传递,触发祖先元素的 onclik 事件,一直到最外层 html 根元素. 这可能会带 ...

  7. 【实验四】[bx]和loop的使用

    四.实验结论 任务一: (1) ①当我写 mov ax,b800h时,编译报错了. ②清屏后运行 (2)将源代码程序中字数据0403H→修改为0441H,再次运行,图案发生了变化. 任务二: (1) ...

  8. [系统集成] RT(Request Tracker)执行自定义脚本及发送微信、短信的实现方法

    RT(Request Tracker)是一个基于 Perl 语言的开源状态跟踪和工作流系统,支持审批.权限管理等功能,中文化支持的也不错,可以作为企业的流程审批系统使用.可惜的是,该系统在国内使用的不 ...

  9. Numerical Analysis

    PART1  <求解方程> 1,二分法 def bisect(f,a,b,TOL=0.000004): u_a = a u_b = b while(u_b-u_a)/2.0 > TO ...

  10. Centos安装Git、DotNet、Docker

    1.安装Git yum install git 可通过下面的命令查看Git版本 git --version 2.安装Dotnet sudo yum install libunwind libicu 导 ...