Как внедрить NG-начальной загрузки NgbDateParserFormatter в служебный класс - PullRequest
0 голосов
/ 01 апреля 2019

При чтении / записи в DatePicker, я определил функцию для анализа года, месяца, дня в формате даты. Я хотел создать статический класс, чтобы использовать эти функции в любом месте моего проекта в качестве класса Utility. При этом у меня возникает проблема с маркером DI NgbDateParserFormatter, поскольку мои методы в классе являются статическими, а в приведенном ниже коде this.ngbDateParserFormatter не определено. Хотя весь этот код прекрасно работает при использовании внутри компонента, так как this.ngbDateParserFormatter не является нулевым. Даже если я определил его снаружи как статический, он все еще не определен. Итак, как внедрить этот токен в служебный класс.

import { Component, Injectable } from '@angular/core';
import {NgbDateParserFormatter, NgbDateStruct, NgbModal, NgbDate } from 
'@ng-bootstrap/ng-bootstrap';
import { DatePipe } from '@angular/common';


export class DateFormatHelper {

 static datePipe = new DatePipe('en-US');


  constructor(private ngbDateParserFormatter: NgbDateParserFormatter) {
 }

 static formatedDate(val: any): any {
 const bDate = val;
  return this.ngbDateParserFormatter.format(bDate);
 }

 static parsengbDate(value: string): NgbDateStruct {
 let returnVal: NgbDateStruct;

  if (!value) {
   returnVal = null;
  } else {
       try {
       const dateParts = this.datePipe.transform(value, 'MM-dd- 
        yyyy').split('-');
       returnVal = { year: Number(dateParts[2]), month: 
       Number(dateParts[0]), day: Number(dateParts[1]) };
     } catch (e) {
       returnVal = null;
     }
   }
    return returnVal;
  }

1 Ответ

0 голосов
/ 01 апреля 2019

NgbDateParserFormatter никогда не будет внедрен, потому что инъекции работают только с классами, экземпляры которых создаются с помощью внедрения зависимостей Angulars (DI).

Чтобы решить вашу проблему, я предлагаю создать Injectable Service со всеми необходимыми вам методами, а затемвнедрите его в каждый компонент, который нуждается в его методах.

Вы можете увидеть учебник по их использованию здесь , но это будет выглядеть так:

import { Component, Injectable } from '@angular/core';
import {NgbDateParserFormatter, NgbDateStruct, NgbModal, NgbDate } from '@ng-bootstrap/ng-bootstrap';
import { DatePipe } from '@angular/common';
import { Injectable } from '@angular/core';

@Injectable({
  providedIn: 'root',
})
export class DateFormatHelper {
  private datePipe = new DatePipe('en-US');
  constructor(private ngbDateParserFormatter: NgbDateParserFormatter) {
  }

 public formatedDate(val: any): any {
 const bDate = val;
  return this.ngbDateParserFormatter.format(bDate);
 }

 public parsengbDate(value: string): NgbDateStruct {
  let returnVal: NgbDateStruct;

  if (!value) {
   returnVal = null;
  } else {
     try {
       const dateParts = this.datePipe.transform(value, 'MM-dd- 
        yyyy').split('-');
       returnVal = { year: Number(dateParts[2]), month: 
       Number(dateParts[0]), day: Number(dateParts[1]) };
     } catch (e) {
       returnVal = null;
     }
   }
    return returnVal;
  }
}

PS Не забудьте добавить NgbDateParserFormatter в качестве поставщика в ваш модуль для их внедрения (не DateFormatHelper, потому что я уже зарегистрировал его в метаданных @Injectable).Чтобы понять, как работают инъекции, посмотрите здесь

...