如何以角度动态删除 MAT_DATE_RANGE_SELECTION_STRATEGY

Posted

技术标签:

【中文标题】如何以角度动态删除 MAT_DATE_RANGE_SELECTION_STRATEGY【英文标题】:How to remove MAT_DATE_RANGE_SELECTION_STRATEGY dynamically in angular 【发布时间】:2021-12-15 13:07:00 【问题描述】:

我正在尝试使用自定义 MAT_DATE_RANGE_SELECTION_STRATEGY 以角度实现日期选择器。允许用户选择 14 天的范围。

使用以下代码(直接取自 Angular 文档)来实现自定义策略

@Injectable()
export class FourteenDayRangeSelectionStrategy<D> implements MatDateRangeSelectionStrategy<D> 
  constructor(private _dateAdapter: DateAdapter<D>) 

  selectionFinished(date: D | null): DateRange<D> 
    return this._createFourteeDayRange(date);
  

  createPreview(activeDate: D | null): DateRange<D> 
    return this._createFourteeDayRange(activeDate);
  

  private _createFourteeDayRange(date: D | null): DateRange<D> 
    if (date) 
      const start = this._dateAdapter.addCalendarDays(date, 0);
      const end = this._dateAdapter.addCalendarDays(date, 13);
      return new DateRange<D>(start, end);
    

    return new DateRange<D>(null, null);
  

并将其注入到组件中,如下所示。

@Component(
  selector: 'app-awesomecomponent',
  templateUrl: './awesomecomponent.component.html',
  styleUrls: ['./awesomecomponent.component.css'],
  providers: [
    provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
    useClass: FourteenDayRangeSelectionStrategy
  ]
)

但是,当用户选择允许自定义日期范围复选框(如上图所示)时,我希望禁用自定义策略并允许用户选择任何日期范围。

我怎样才能实现这个功能?我假设,我们需要从组件中动态删除以下内容以允许选择任何日期。但是我不知道该怎么做。

providers: [
    provide: MAT_DATE_RANGE_SELECTION_STRATEGY,
    useClass: FourteenDayRangeSelectionStrategy
  ]

请帮忙。

【问题讨论】:

【参考方案1】:

您在github 中有 MatDateRangeSelectionStrategy 的来源,因此您可以使用变量来激活或不激活策略。

export class FourteenDaySelectionStrategy<D>
  implements MatDateRangeSelectionStrategy<D>

  constructor(private _dateAdapter: DateAdapter<D>) 
  off: boolean = false; //--use a variable "off"
  selectionFinished(date: D | null, currentRange: DateRange<D>): DateRange<D> 
    if (!this.off) return this._createFourteenDayRange(date);

    //see that al the code below is the code of the github
    let  start, end  = currentRange;

    if (start == null) 
      start = date;
     else if (
      end == null &&
      date &&
      this._dateAdapter.compareDate(date, start) >= 0
    ) 
      end = date;
     else 
      start = date;
      end = null;
    

    return new DateRange<D>(start, end);
  

  createPreview(
    activeDate: D | null,
    currentRange: DateRange<D>
  ): DateRange<D> 
    if (!this.off) return this._createFourteenDayRange(activeDate);

    //see that al the code below is the code of the github
    let start: D | null = null;
    let end: D | null = null;

    if (currentRange.start && !currentRange.end && activeDate) 
      start = currentRange.start;
      end = activeDate;
    

    return new DateRange<D>(start, end);
  

  private _createFourteenDayRange(date: D | null): DateRange<D> 
    if (date) 
      const start = date;
      const end = this._dateAdapter.addCalendarDays(date, 14);
      return new DateRange<D>(start, end);
    

    return new DateRange<D>(null, null);
  

现在,您需要注入 MatDateRangeSelection 并使用 getter 来更改变量 off 的值

  constructor(
    @Inject(MAT_DATE_RANGE_SELECTION_STRATEGY)
    private rg: FourteenDaySelectionStrategy<any>
  ) 
  get customRange() 
    return this.rg.off;
  
  set customRange(value) 
    this.rg.off = value;
  

带有[(ngModel)] 的复选框完成代码

见stackblitz

【讨论】:

这是正确的,感谢代码。

以上是关于如何以角度动态删除 MAT_DATE_RANGE_SELECTION_STRATEGY的主要内容,如果未能解决你的问题,请参考以下文章

角度 5 - 如何从 dom 中删除动态添加的组件

取消绑定 ng-click 以获取角度中的动态 dom 元素

如何以角度动态设置属性?

如何以角度动态创建 n 级嵌套展开/折叠组件

如何让组件在单击按钮时以角度删除自身

我如何以角度动态化我的 Flash 消息。消息必须来自 API 响应