【问题标题】:Angular material date picker how to show the title角度材料日期选择器如何显示标题
【发布时间】:2019-12-23 16:52:52
【问题描述】:

当用户悬停特定日期时,我需要显示当天的标题或重要性。当用户将鼠标悬停在日历弹出窗口上时,例如:12 月 25 日,我需要显示一条消息“圣诞快乐”。

我尝试过使用 HTML,但它不起作用

<mat-form-field>
      <input matInput [matDatepicker]="picker" (click)="picker.open()" placeholder="Choose a date">
      <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
      <mat-datepicker #picker [dateClass]="dateClass" title="ariaLabel"></mat-datepicker>
    </mat-form-field>

ts 文件

ariaLabel = (d: Date) => {
    const date = d.getDate();
    return (date === 25) ? 'Happy Christmas' : undefined;
  }

如何在 Angular 材料中实现特定日期的自定义消息?

【问题讨论】:

标签: angular angular-material


【解决方案1】:

感谢question in stackoverflow,我们可以加入所有人

我真的不喜欢使用 querySelectorAll,但我认为这是唯一的方法,所以去吧

我们有一组选定的日期

  dates = [
    { date: "2019-12-01", text: "one text" },
    { date: "2019-12-20", text: "another text" }
  ];

所以,首先我们要使用 dateClass 来赋予特殊的颜色

  dateClass = (d: Date) => {
    const dateSearch = this.dateToString(d);
    return this.dates.find(f => f.date == dateSearch)
      ? "example-custom-date-class"
      : undefined;
  };

我使用辅助函数将日期对象转换为字符串

  dateToString(date: any) {
    return (
      date.getFullYear() +
      "-" +
      ("0" + (date.getMonth() + 1)).slice(-2) +
      "-" +
      ("0" + date.getDate()).slice(-2)
    );
  }

如果我们的班级是这样的

.example-custom-date-class {
  background: orange;
  border-radius: 100%;
}
.example-custom-date-class:hover::after {
  counter-increment: section; 
  content:attr(aria-label);
  position: absolute;
  left: 0;
  top: 24px;
  min-width: 200px;
  border: 1px #aaaaaa solid;
  border-radius: 10px;
  background-color: #ffffcc;
  padding: 12px;
  color: #000000;
  font-size: 14px;
  z-index: 1;
}

我们有一个使用 aria-label 值的“工具提示”。因此,我们将更改 arial 标签。我们有一个函数

  displayMonth() {
    let elements = document.querySelectorAll(".endDate");
    let x = elements[0].querySelectorAll(".mat-calendar-body-cell");
    x.forEach(y => {
      const dateSearch = this.dateToString(
        new Date(y.getAttribute("aria-label"))
      );
      const data = this.dates.find(f => f.date == dateSearch);
      if (data) y.setAttribute("aria-label", data.text);
    });
  }

我们需要在打开日历和点击导航按钮时调用,所以我们需要使用一些类似

  streamOpened(event) {
    setTimeout(() => {
      let buttons = document.querySelectorAll("mat-calendar .mat-icon-button");

      buttons.forEach(btn =>
        this.renderer.listen(btn, "click", () => {
          setTimeout(() => {
            //debugger
            this.displayMonth();
          });
        })
      );
      this.displayMonth();
    });
  }

html

<mat-form-field class="example-full-width" >
  <input matInput [matDatepicker]="picker" placeholder="Choose a date">
  <mat-datepicker-toggle matSuffix [for]="picker"></mat-datepicker-toggle>
  <mat-datepicker (opened)="streamOpened($event)" [dateClass]="dateClass" #picker panelClass="endDate" ></mat-datepicker>
</mat-form-field>

还有stackblitz

【讨论】:

  • this.renderer 出错并说 renderer 是未知属性
  • 你注入构造函数private renderer:Renderer2了吗?
猜你喜欢
  • 1970-01-01
  • 2022-12-17
  • 2018-09-13
  • 2021-01-21
  • 1970-01-01
  • 2020-09-23
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多