2017-02-06 40 views
2

Мне нужно настроить общий загрузчик на весь проект angular2. Так что я просто хочу сделать это, когда мой новый вызов http сгенерирует либо GET, POST, либо PUT, а затем появится запрос отправителя загрузки. Как только http ответ (успех или ошибка) поступает с сервера, тогда загрузчик должен исчезнуть.Вызов общей функции до и/или после HTTP-запроса в угловом 2

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

Я не хочу использовать jQuery или Javascript.

ответ

2

Создайте http-перехватчик и вызовите свои общие функции внутри него. Вы можете либо написать собственную реализацию перехватчик like this или использовать an external library

1
@Injectable() 
class MyService { 
    private change:Subject<boolean> = new BehaviorSubject(false); 
    public change$ = this.change.asObservable(); 

    constructor(private http:Http) {} 

    get(...) { 
    this.change.next(true) 
    return this.http.get(...) 
    .map(...) 
    .finally(_ => this.change.next(false); 
    } 
} 
@Component({ 
    selector: 'loader', 
    template: ` 
    <div *ngIf="myService.change | async">is loading ...</div> 
` 
)} 
class LoaderComponent { 
    constructor(public myService:MyService){} 
} 
2

Расширение HTTP работает хорошо - в нашем проекте мы также хотели явный контроль «загрузчика» ака блесны для некоторых сценариев. Таким образом, у нас есть SpinnerService в нашем Core module, который доступен для всех компонентов.

@Injectable() 
export class SpinnerService { 

    private spinnerStateSource = new Subject<SpinnerState>(); 
    spinnerState$ = this.spinnerStateSource.asObservable(); 

    private defaultMessage: string = 'Loading...'; 

    show(message?: string) { 

    let msg = this.defaultMessage as string; 
    if (message) { 
     msg = message; 
    } 

    this.spinnerStateSource.next({ showing: true, message: msg }); 
    } 

    hide() { 
    this.spinnerStateSource.next({ showing: false, message: '' }); 
    } 

    spin(obs: Observable<any>, message?: string): Observable<any> { 
    this.show(message); 
    return obs.finally(() => this.hide()); 
    } 

} 

class SpinnerState { 
    showing: boolean; 
    message: string; 
} 

компонент в основном модуле подписывается на услугу, чтобы показать/скрыть фактический спиннера UI (EDIT: так же, как в @ ответ Гюнтера в), а также другие компоненты могут (через службу) скажите вертушку, чтобы показать /скрывать.

Пример, который мы используем, если компонент должен выполнять несколько HTTP-вызовов, например. получить некоторые справочные данные, тогда мы хотим, чтобы счетчик показывал, пока все эти вызовы не будут выполнены. Поэтому мы вызываем функцию spin с действием, которое мы ожидаем на

например. в потребляющем компоненте:

this.spinnerService.spin(
    Observable.forkJoin(
     this.refDataService.getRefDataList('statusTypes'), 
     this.refDataService.getRefDataList('itemTypes') 
    ) 
).subscribe(result => { 
      this.statusTypes = result[0]; 
      this.itemTypes = result[1]; 
}); 
+0

Здесь вы использовали 'SpinnerState'. Что это за значение по умолчанию? Я получил ошибку, когда копирую этот код. Также что такое 'spinnerState $'? – Jitendra

+0

Это тип, содержащий информацию, чтобы перейти к spinner - я отредактировал мой пост –

+0

Это хорошо работает, но мне нужно импортировать эту службу, когда я использую ее метод. Любой способ установить общий? Когда любой HTTP-запрос генерируется, он автоматически вызывает метод 'spinnerService.spin', поэтому мне не нужно вызывать этот метод в каждом запросе. – Jitendra

 Смежные вопросы

  • Нет связанных вопросов^_^