Служба угловой вставки в file.html

#angular #sharedservices

#angular #общие услуги #общие сервисы

Вопрос:

Я использую Angular 7 (и однажды мне придется обновить свою версию). У меня есть сервис, в котором есть некоторые переменные, которые могут изменяться в соответствии с некоторыми Promise (http GET , PUT , … ответ).

Я хочу напечатать эти переменные в шаблоне.

Могу ли я это сделать:

app.component.html:

 <ng-container *ngIf="this.dogService.isWarningProblem">
    <ngb-alert [dismissible]="false" type="warning" style="text-align: center">
        {{this.dogService.errorMessage}}
    </ngb-alert>
</ng-container>
  

app.service.ts:

 export class DraftService {

    public errorMessage: string;
    public isWarningProblem: boolean;

    constructor
        (
            private generalErrorService: GeneralErrorService,
            private http: HttpClient
        ) {
            [...]
        }

    public launchPingEditReadDraftByActionOfferIdUrl(action: string, offerIdUrl: string): Subscription {
        return interval(10).subscribe(
            () => {
                //Get variables from the server and set them.
            },
            () => {}
        );
    }

}
  

Я хочу использовать сервис, потому что алгоритм равен другим компонентам, но они не могут видеть переменные других компонентов. Итак, я не могу использовать подписку с объектом поведения и наблюдаемым:

Есть ли какие-либо лучшие решения?

Комментарии:

1. Для этого вы должны использовать environment.ts файлы.

Ответ №1:

Нет, это не best practice для отображения результата службы непосредственно в шаблоне. Лучше внедрить ваш service как dependency (внедрение зависимостей) в ваш компонент, который устанавливает некоторые variables с результатом обслуживания и отображает их в вашем шаблоне. Итак, попробуйте что-то вроде этого:

app.service.ts

 import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';

@Injectable({ providedIn: 'root' })
export class DraftService {

    private errorMessage$ = new Subject<string>();
    private isWarningProblem$ = new Subject<boolean>();

    
    constructor (
      private generalErrorService: GeneralErrorService,
      private http: HttpClient
    ) {
       this.launchPingEditReadDraftByActionOfferIdUrl();
    }

    sendErrorMessage(message: string) {
        this.errorMessage$.next({ text: message });
    }

    clearErrorMessages() {
        this.errorMessage$.next();
    }

    onErrorMessage(): Observable<any> {
        return this.errorMessage$.asObservable();
    }

    public launchPingEditReadDraftByActionOfferIdUrl (action: string, offerIdUrl: string): Subscription {
      interval(10).subscribe(
        (res) => {
          this.sendErrorMessage(res.errorMessage);
          // The other like this
        });
    }
}
  

app.component.ts

 import { Component } from '@angular/core';
import { DraftService } from './draft-service';

@Component({
  selector: 'app-template',
  templateUrl: './template.component.html',
  styleUrls: ['./template.component.css'],
})
export class TemplateComponent {

  public errorMessage: string;
  public isWarningProblem: boolean;

  constructor(
    private _draftService: DraftService,
  ) { }
   
  ngOnInit() {
    this._draftService.onErrorMessage().subscribe(
      res => {
        this.errorMessage = res
        //The other like this
      }
    );
  }
}
  

app.component.html

 <ng-container *ngIf="isWarningProblem">
  <ngb-alert [dismissible]="false" type = "warning" style="text-align: center">
    {{errorMessage}}
  </ngb-alert>
</ng-container>
  

Комментарии:

1. Я благодарю вас, но interval(10).subscribe устанавливайте значение каждые 10 минут, и в вашем решении я не могу гарантировать, что новое значение будет установлено.

2. Все в порядке. В вашем Service.ts и в interval(10).subscribe() создайте событие с использованием нового observable.next() и в компоненте, на который вы подписались, потому что вы получите новые значения и сбросите ваши переменные, и ваш шаблон будет отображен.

3. Я добавил пример сервиса для вас в свой ответ. проверьте это