angular - вызвать функцию из другого файла машинописи - PullRequest
0 голосов
/ 26 июня 2018

Я столкнулся с проблемой при вызове функции / метода из другого файла машинописи.Я прочитал много статей и обнаружил, что с помощью сервиса это легко сделать, поэтому здесь я со своим кодом, но он не работает.Он не выдает никаких ошибок, но и не дает никаких результатов.

trigger.html

<button (click) = "openToast();" type="button" class="btn btn-primary btn-block">
  Open Toast
</button>

trigger.ts

import { Component, OnInit } from '@angular/core';
import { MessageService } from '../message.service';

@Component({
  selector: 'app-trigger',
  templateUrl: './trigger.component.html',
  styleUrls: ['./trigger.component.scss'],
  providers: [MessageService]
})
export class TriggerComponent implements OnInit {

  constructor(private _messageService: MessageService) { }

  ngOnInit() {
  }

  openToast(){
    this._messageService.callToastr();
  }

}

message.service

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

@Injectable({
  providedIn: 'root'
})
export class MessageService {
  invokeEvent = new Subject<any>();

  listen(): Observable<any> {
    return this.invokeEvent.asObservable();
  }

  callToastr(){
    this.invokeEvent.next('Y');
  }
  constructor() { }
}

home.ts

import { MessageService } from '../message.service';

const types = ['success', 'error', 'info', 'warning'];

@Component({
  templateUrl: './home.component.html',
  providers: [MessageService]
})
export class HomeComponent {

constructor(public toastr: ToastrService, private renderer: Renderer2, public _dataService: DataService,
              public _messageService: MessageService) {
    this.options = this.toastr.toastrConfig;
    this._messageService.listen()
    .subscribe( value => {
      if (value === 'Y') {
        this.openToast();
      }
    })
  }

 openToast() {
    const { message, title } = this.getMessage();
    // Clone current config so it doesn't change when ngModel updates
    const opt = cloneDeep(this.options);
    const inserted = this.toastr.show(
      message,
      title,
      opt,
      this.options.iconClasses[this.type],
    );
    if (inserted) {
      this.lastInserted.push(inserted.toastId);
    }
    return inserted;
  }
}

Я пробовал это разными способами, но каждый раз терпел неудачу.Может кто-нибудь, пожалуйста, помогите в поиске первопричины?Заранее спасибо!

1 Ответ

0 голосов
/ 26 июня 2018

Насколько я вижу, ваш метод цепочки верен.Что я скучаю, так это ViewContainerRef.Вы должны установить его хотя бы один раз, чтобы сказать Toastr, где появиться.Расширьте свой код в home.ts следующим образом:

import { ViewContainerRef } from '@angular/core';

constructor(
    public toastr: ToastrService,
    public toastrMgr: ToastrManager, 
    private renderer: Renderer2,
    public _dataService: DataService,
    public _messageService: MessageService,
    private viewContainerRef: ViewContainerRef
) {
    this.toastrMgr.setRootViewContainerRef(viewContainerRef);

    // the rest of your code in constructor
}

Обратите внимание, что было бы намного проще, если бы вы поместили ViewContainerRef в ваш иерархически самый высокий компонент.Обычно это app.component.ts.В противном случае вы должны внедрить этот код видеомагнитофона в каждый отдельный компонент, который должен показывать сообщения тостера.

Но для начала просто попробуйте, если из-за этого решения появится toastr в home.ts.

...