开发环境及内容
- Angular11
- angular-calendar
- 自定义 Pipe 修改日期內容
需求
目前日期组件中的日期当我选到一个日期的时候,会显示如下图。
但项目需求要改成 2021, 6/27 - 7/3
。
处理流程
首先这是套件已经封装好的日期格式,再通过观察发现只有在week的时候会显示日期范围的呈现,所以变成我要改成自定义的方式,这时前辈的提点说可以使用Pipe来转换显示。
建立 Pipe
基本的 date pipe 可以看 Angular教程 - Pipe 管道:date日期格式化转换
那这边要通过自定义的Pipe才能转换日期格式,首先,我们建立一个pipe的ts档案,命名为为 weekRange.pipe.ts
。
- 先输入
@Pipe
通过只能提示,会出现选项,然后它是一个 function,里面是一个对象,key
是name
,value
是这个pipe
在 HTML 要使用的名字,是字符串。 - 要 export 这个 pipe,创建一个类,如这里命名test,并且用
PipeTransform
来实现。 - 里面要用 tranform 的方法,参数就是我们要转换的
date
。
import { Pipe, PipeTransform } from "@angular/core"; @Pipe({ name: "test", }) export class test implements PipeTransform { transform(date: string) {} }
到这里我们就完成基础设置,pipe的创建
记得要去 app.module.ts
的 declaration 中导入 pipe。
具体导入的位置以实际为准
取到日期并开始分割它
我们先把日期数据输出到console,看看它是个什么样的
console.log
确认取到的格式是正确的,我们继续
使用 split 分割
let time = date.split(","); console.log("time:", time); // 会得到一个数组
我们会得到一个数组,如下图。
这时候我已经取到年份了,再来我要处理月跟日。所以我先把年先存起来。然后刚刚可以观察到两个日期中间有一个 横线 作为连接,所以要把这个去掉。
const year = time[1]; //年 const firstDay = time[0].split("-"); console.log("firstDay:", firstDay);
一样使用 split()
将 横线两边的字串取出,又会得到一个数组。
会发现月跟日中间有一个空白,也是用 split() 去分割字符串,并且用变量将其存取。这样我就有开始月跟结束月以及开始日跟结束日。
const getStartDay = firstDay[0].split(" "); const getEndDay = firstDay[1].split(" "); console.log("getStartDay:", getStartDay, "getEndDay:", getEndDay);
取到需要的字符串
已经将字串处理好之后,剩下的就是组合了,所以我依序按照数组的排序取得我要的字串内容。
//* 取到字符串 const startMonth = getStartDay[0]; const startDay = getStartDay[1]; //6 const endDay = getEndDay[2]; const endMonth = getEndDay[1]; //6 or 7
将英文的月份转成数字
使用两个函式,并且用 switch
去转换起讫月的格式。
getStartMonth(startMonth: string) { let month = ""; switch (startMonth) { case "Jan": return (month = "1"); case "Feb": return (month = "2"); case "Mar": return (month = "3"); case "Apr": return (month = "4"); case "May": return (month = "5"); case "Jun": return (month = "6"); case "Jul": return (month = "7"); case "Aug": return (month = "8"); case "Sep": return (month = "9"); case "Oct": return (month = "10"); case "Nov": return (month = "11"); case "Dec": return (month = "12"); } } getEndMonth(endMonth: string) { let month = ""; switch (endMonth) { case "Jan": return (month = "1"); case "Feb": return (month = "2"); case "Mar": return (month = "3"); case "Apr": return (month = "4"); case "May": return (month = "5"); case "Jun": return (month = "6"); case "Jul": return (month = "7"); case "Aug": return (month = "8"); case "Sep": return (month = "9"); case "Oct": return (month = "10"); case "Nov": return (month = "11"); case "Dec": return (month = "12"); } }
组合成需求要的显示格式
使用模板语法呈现此时间格式。
return `${year}, ${this.getStartMonth( startMonth )}/${startDay} - ${this.getEndMonth(endMonth)}/${endDay}`;
然后到这里就算是完成了。你学会了?
最新评论