2016-07-22 4 views
4

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

Я попытался сделать это, возвратив наблюдаемый, но он не работает.

canDeactivate(): Observable<boolean> | boolean { 
    if(this.isFormStarted()) { 
     this.formService.showExitModal(true); 
     return this.formService.getModalSelectionObservable(); 
    } 
    else { 
     return true; 
    } 
} 

Ничего не происходит, когда я нажимаю подтвердить, даже если я могу видеть, что наблюдаемая работает нормально, когда я делаю console.log внутри если блок

this.formService.getModalSelectionObservable().subscribe(
     value => console.log("dialog value: " + value) 
    ); 

Вот как форма обслуживания выглядит ,

private modalConfirmation = new Subject<boolean>(); 

public setModalSelectionObservable(confirmLeave: boolean) { 
    this.modalConfirmation.next(confirmLeave); 
} 
public getModalSelectionObservable(): Observable<boolean> { 
    return this.modalConfirmation.asObservable(); 
} 
+0

почему, что вы используете 2 различных услуг в вашей 'функции canDeactivate':' 'this.formService' и this.createFormService'? –

+0

Да, они должны быть одинаковыми, я обновил его, спасибо. Я просто изменил имена переменных, чтобы они имели больше смысла здесь. –

+0

Привет, Марк, как сделать свой модальный ждет ответа пользователя? Вы могли бы поделиться своим решением? У меня такая же проблема. С уважением –

ответ

7

Использование take(1) или first() (не забудьте импортировать)

return this.formService.getModalSelectionObservable().first(); 

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

+0

Привет, Гюнтер, не могли бы вы объяснить мне, как работать с 'getModalSelectionObservable'? Я сталкиваюсь с той же проблемой, и я не знаю, как сделать обновление ожидающим результата от модального. –

+0

Я не знаю о 'getModalSelectionObservable()'. Я знаю только о 'canDeactivate' –

+0

Я вижу ... Я сталкиваюсь с этой проблемой с canDeactivate ... Я не могу показать пользовательские сообщения или диалог, используя сервис ... [см. Мой вопрос] (http: // stackoverflow.com/questions/42142053/candeactivate-confirm-message) ..может мне помочь? –

0

Просто положить это здесь, в случае кто-то в будущем, как неосторожно, как я:

Если компонент имеет функцию hasUnsavedChanges() ваш метод canDeactivate() нужно будет возвращать !hasUnsavedChanges().

Но если вы начнете использовать наблюдаемый для hasUnsavedChanges, вы будете возвращать !hasUnsavedChanges$, который будет просто ложным.

Если вам нужна поддержка как вы можете сделать это:

canDeactivate(component: C) 
{ 
    var hasUnsavedChanges = component.hasUnsavedChanges(); 

    if (typeof (hasUnsavedChanges) === 'boolean') 
    { 
     return !hasUnsavedChanges; 
    } 
    else 
    { 
     return hasUnsavedChanges.map(x => !x); 
    } 
}