Angular Material DatePicker 的多个日期范围过滤器

2024-02-09

我的数据中有多个 startDate 和 endDate,我想将其用于 Angular 的 datePicker 材质中禁用的日期范围。

我看到这个问题:link https://stackoverflow.com/questions/57904882/angular-how-to-configure-a-date-picker-to-disable-multiple-date-ranges/73433548?noredirect=1#comment129681283_73433548, 但在这个例子中是两个表,在我的例子中我有很多表,所以我用循环开始代码,但我不知道如何使用它

这是我的代码:

import { formatDate } from '@angular/common';
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { map, Observable } from 'rxjs';
import { Booking } from 'src/app/core/models/booking.model';
import { BookingService } from 'src/app/core/services/booking.service';

@Component({
  selector: 'app-booking',
  templateUrl: './booking.component.html',
  styleUrls: ['./booking.component.scss'],
})
export class BookingComponent implements OnInit {
  idAccommodation!: number;
  bookingAccommodation$!: Observable<Booking[]>;
  dateBooking: Array<Array<any>> = [];
  dateDisabled!: any;

  constructor(
    private activedRoute: ActivatedRoute,
    private bookingService: BookingService
  ) {}

  ngOnInit(): void {
    this.idAccommodation = +this.activedRoute.snapshot.params['id'];
    this.bookingService
      .getBookingByIdAccommodation(this.idAccommodation)
      .pipe(map((res: any) => res['hydra:member']))
      .subscribe({
        next: (res: any) => {
          res.forEach((element: any) => {
            this.dateBooking.push([
              new Date(element.startDate),
              new Date(element.endDate),
            ]);
          });

          this.dateBooking.forEach((element) => {
            element.forEach((date) => {
              console.log(date);
            });
          });

          this.dateDisabled = (date: Date | null): any => {
            return (
              !(
                date! >= this.dateBooking[1][0] &&
                date! <= this.dateBooking[1][1]
              ) && date! >= new Date()
            );
          };
        },
      });
  }
}

谢谢你的帮助????


当你使用 Date javascript 对象时你需要小心

mat-datepicker 返回一个类型的日期对象,例如

Mon Sep 19 2022 00:00:00 GMT+0200

当您使用时,例如

new Date('2022-08-24')
//you get
Date Wed Aug 24 2022 02:00:00 GMT+0200

看看如何添加“02:00:00” - 因为我在 GTM+0200。因此,您首先需要的是使用 setHours 将您的范围设置为 00:00:00

res.forEach((element: any) => {
   const el=[
          new Date(element.startDate),
          new Date(element.endDate),
        ]
        el[0].setHours(setHours(0, 0, 0, 0))
        el[1].setHours(setHours(0, 0, 0, 0))
        this.dateBooking.push(el);
      });
}

同样,你需要小心对待“今天”。所以在 ngOnInit 中你可以使用

  ngOnInit() {

    //see how use setHours also in today
    const today = new Date();
    today.setHours(0, 0, 0, 0);

    this.dateDisabled = (date: Date | null): any => {
      if (date! < today) return false;
      for (let i = 0; i < this.dateBooking.length; i++) {
        if (date! >= this.dateBooking[i][0] && date! <= this.dateBooking[i][1])
          return false;
      }
      return true;
    };

    //or

    this.dateDisabled = (date: Date | null): any => {
      return (
        date! >= today &&
        this.dateBooking.reduce((a, b) => {
          return a && (date! < b[0] || date! > b[1]);
        }, true)
      );
    };
  }

注意:第二种方法循环遍历 dateBooking 的所有元素。它看起来比第一个慢,但实际上花费的时间(30 天* dateBooking.length)并不可观

see 堆栈闪电战 https://stackblitz.com/edit/angular-nosmhs?file=src%2Fapp%2Fdatepicker-overview-example.ts

注意2:如果您需要多个“dateDisabled”函数,请使用函数数组

dateDisabled:((date: Date | null)=>any)[]=[]

//  and use 
dateDisabledObj[index]=(date: Date | null): any => {...}

Or 和函数对象

dateDisabledObj:any={}

// and use 
dateDisabledObj[''+id]=(date: Date | null): any => {...}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular Material DatePicker 的多个日期范围过滤器 的相关文章

随机推荐

  • 找到具有相同权重的最大边数的生成树

    问题就在这里 给出一个带权无向连通图G 权重是恒定的 任务是提出一种算法 找到满足这两个条件的 G 的生成树的总权重 按优先级排序 生成树必须有相同权重的最大边数 与实际重复重量值无关 应最小化总生成树重量 这意味着 例如 权重为 120
  • 为什么.NET不验证BCL/CLR?

    BCL 和 CLR 中的所有 NET 程序集 以后仅使用 CLR 都是强命名和数字签名 https stackoverflow com questions 1334631 signing of net assemblies 提供数字证书是为
  • AngularJS,防止在茉莉花测试期间启动控制器上的 init 方法

    我有一个带有在实例化时启动的 init 方法的控制器 它做了很多对我的应用程序在实时环境中有用的事情 但这会扰乱我的单元测试间谍 在单元测试环境中实例化控制器时 有没有办法阻止它的调用 或者也许有一种方法可以在 web 应用程序上下文中自动
  • 这个R符号是什么意思?

    我将主题模型的文本上传到第四列 但显示的不是文本 而是此符号 当我将鼠标悬停在它上面时 我可以阅读文本 但是 我想确保这个符号不会误导我的结构主题模型分析 谢谢你 我刚刚运行主题模型没有问题 我认为这个符号表明单元格包含大文本 例如 几页单
  • R 将 RSelenium 驱动程序环境作为函数参数传递

    我可能没有看到明显的东西 无论如何我想创建函数来自动从远程驱动程序已处理的 URL 中提取文本 我想将 xpath 表达式和可以找到远程驱动程序的环境作为函数参数传递 library RSelenium url http stackover
  • ActiveMQ:如何使旧消息出队?

    我正在学习如何使用ActiveMQ 现在我们面临以下问题 假设我在 ActiveMQ 上有一个名为 topic test 的主题 它有两个订阅者 在特定时刻 我只有一个订阅者在等待消息 而生产者则为我上面提到的主题发送一条消息 好的 连接的
  • 没有模块前缀路由路径的 Rails 名称范围模型对象

    我对 Rails 路由器和表单生成器有一点问题 我的应用程序具有用于模型和控制器的命名空间模块 模块用于更轻松地抽象到另一个项目 我用在routes rb范围方法而不是命名空间 因为我不想有 丑陋 的路径助手 看起来像 scope modu
  • 如何使用 scrapy.Request 将另一个页面的元素加载到项目中

    我使用 Scrapy 创建了一个网络抓取工具 它能够从每张票证中抓取元素website http www vividseats com concerts awolnation tickets html但无法刮掉票价 因为页面上没有该票价 当
  • 如何将预先填充的 Default.realm 文件加载到设备上?

    我有一个领域文件 其中已填充了在设备上加载应用程序时需要的数据 我可以做什么来将领域文件获取到我的设备上进行测试 以及当有人从应用程序商店下载应用程序时 我需要做什么来确保它已经存在 我正在使用斯威夫特 Add your database
  • Intellij 14.1.4 CE spring boot 1.3.0.M1,spring-dev-tools 热重载不起作用

    刚刚使用 spring 初始化程序和 spring dev tools 启动了一个 spring boot 应用程序 然后导入到 Intellij 14 1 4 CE 中 我可以使用 gradle 很好地运行应用程序bootRun但无法使热
  • javascript图像覆盖在指定的div上

    我是 JavaScript 新手 实际上很新 这应该是我的第一个脚本 谁能向我解释如何在任何指定的固定宽度区域 例如 700x300px 上制作透明叠加层 您可以定义覆盖 例如 div class myoverlay contents di
  • 如何在高空照片中高效找到地平线?

    我试图检测从高空拍摄的图像中的地平线 以确定相机的方向 我也试图让它运行得更快 理想情况下 我希望能够在 Raspberry Pi 上实时处理帧 即每秒几帧 到目前为止我所采取的方法是基于这样一个事实 在高海拔地区 天空非常暗 如下所示 我
  • 通过 Comma IDE 使用时间轴可视化时出现“无法获取时间轴数据”

    执行答案后这个问题是关于如何设置时间可视化脚本 https stackoverflow com questions 58428899 do we need to modify a script to be able to use the t
  • 为所有下拉菜单调用值更改侦听器,而不仅仅是当前的

    我正在使用 MyFaces 1 1 我有两个
  • SET tx_isolation 与 SET TRANSACTION ISOLATION LEVEL

    在MySQL 尤其是5 5 中 我们似乎有两种不同的方法来设置事务隔离级别 我只是想知道我的想法是否正确 SET TRANSACTION ISOLATION LEVEL REPEATABLE READ 完全一样 SET tx isolati
  • 无法将应用程序部署到 ios 8 设备

    刚刚将 iPad Mini 更新到 iOS 8 突然无法使用 XCode 6 0 1 调试我的应用程序 Xcode 中的错误是App installation failed with An unknown error has occurre
  • 如何在cdef中等待?

    我有这个 Cython 代码 简化 class Callback async def foo self print called cdef void call foo void callback print call foo asyncio
  • Redux 状态通过数据库持久化

    从讨论来看here https stackoverflow com questions 32949859 redux opinions examples of how to do backend persistence 33055146看来
  • VS Code - 集成终端退出,代码为 1

    我的 VS Code 集成终端仅切换一秒钟 然后随命令消失Ctrl 尝试改变它 仍然不起作用 显示Integrated terminal exited with code 1 error 有修复它的想法吗 我在 Windows 10 上遇到
  • Angular Material DatePicker 的多个日期范围过滤器

    我的数据中有多个 startDate 和 endDate 我想将其用于 Angular 的 datePicker 材质中禁用的日期范围 我看到这个问题 link https stackoverflow com questions 57904