Как использовать SnackBar в сервисе для использования в каждом компоненте в Angular 2
У меня есть рабочая закусочная, но это только для каждого компонента, я хочу добавить его в свою службу, поэтому я просто позвоню. Это мой образец на моем component.ts
import { MdSnackBar, MdSnackBarRef } from '@angular/material';
...
export class EmployeeListComponent implements OnInit {
public toastRef: MdSnackBarRef<any>;
constructor(private _activatedRoute:ActivatedRoute,private router: Router, private http:PMISHttpService, private toast: MdSnackBar) {
ngOnInit() {
this.notify('test');
}
...
notify (text: string) {
this.toastRef = this.toast.open(text, null);
setTimeout(() => {
this.toastRef.dismiss();
}, 5000);
}
...
}
Ответы
Ответ 1
Если вы хотите, чтобы SnackBar работал во всем приложении, поместите его в свой app.component и свяжитесь с ним с помощью службы.
notification.service.ts:
public notification$: Subject<string> = new Subject();
app.component.ts:
constructor(
private notificationService: NotificationService, private snackBar: MatSnackBar
) {
this.notificationService.notification$.subscribe(message => {
this.snackBar.open(message);
});
}
any.component.ts:
this.notificationService.notification$.next('this is a notification');
Ответ 2
Чтобы он был везде, создайте для него сервис. Также вы должны использовать конфигурацию закусочной для установки продолжительности и сделать закусочную общедоступной:
import {Injectable, NgZone} from '@angular/core';
import {MatSnackBar} from '@angular/material';
@Injectable()
export class CustomSnackbarService {
constructor(
public snackBar: MatSnackBar,
private zone: NgZone
) {}
public open(message, action = 'success', duration = 50000) {
this.zone.run(() => {
this.snackBar.open(message, action, { duration });
});
}
}
Также его нужно запустить в ngZone
: https://github.com/angular/material2/issues/9875
Затем в компоненте:
customSnackbarService.open('hello')
Ответ 3
Вы можете легко сделать это. Ниже приведен пример для примера, который я использовал в одном из моих проектов, и он отлично работает
import { Injectable } from '@angular/core';
import {
MatSnackBar,
MatSnackBarConfig,
MatSnackBarHorizontalPosition,
MatSnackBarVerticalPosition,
MatSnackBarRef
} from '@angular/material';
@Injectable()
export class SnackBarService {
snackBarConfig: MatSnackBarConfig;
snackBarRef: MatSnackBarRef<any>;
horizontalPosition: MatSnackBarHorizontalPosition = 'center';
verticalPosition: MatSnackBarVerticalPosition = 'top';
snackBarAutoHide = '1500';
constructor(private snackBar: MatSnackBar) { }
openSnackBar(message) {
this.snackBarConfig = new MatSnackBarConfig();
this.snackBarConfig.horizontalPosition = this.horizontalPosition;
this.snackBarConfig.verticalPosition = this.verticalPosition;
this.snackBarConfig.duration = parseInt(this.snackBarAutoHide, 0);
this.snackBarConfig.panelClass = 'glam-snackbar';
this.snackBarRef = this.snackBar.open(message, '', this.snackBarConfig);
}
}
Теперь вам нужно только внедрить этот сервис в ваш компонент или где-либо, где вы хотите его использовать, и вызвать метод openSnackBar() с сообщением, которое вы хотите показать.
Надеюсь это поможет!!
Ответ 4
Я использую версию ":" 2.0.0-beta.10 ", это то, что я сделал, чтобы она работала
В ApModule
import { NotificationService } from "./notification/notification.service";
import { MdSnackBarModule } from "@angular/material";
@NgModule({
imports: [
MdSnackBarModule,
FormsModule
],
providers: [WebService, NotificationService]
Создайте сервис уведомлений, как предложено в предыдущем посте
import { Injectable } from "@angular/core";
import {
MdSnackBar,
MdSnackBarConfig,
// MdSnackBarHorizontalPosition,
// MdSnackBarVerticalPosition,
MdSnackBarRef
} from "@angular/material";
@Injectable()
export class NotificationService {
private snackBarConfig: MdSnackBarConfig;
private snackBarRef: MdSnackBarRef<any>;
private snackBarAutoHide = "5000"; //milliseconds for notification , 5 secs
constructor(private sb: MdSnackBar) {}
openSnackBar(message) {
this.snackBarConfig = new MdSnackBarConfig();
//this.snackBarConfig.horizontalPosition = this.horizontalPosition; only in current version Demo uses very old version . need to upgrade later
//this.snackBarConfig.verticalPosition = this.verticalPosition; only in current version Demo uses very old version . need to upgrade later
this.snackBarConfig.duration = parseInt(this.snackBarAutoHide, 0);
this.sb.open(message, "", this.snackBarConfig);
}
}
Потреблять услуги, как показано ниже
this.notify.openSnackBar(message);