Я пытаюсь использовать функцию routerCanDeactivate
для компонента в моем приложении. Простой способ его использования заключается в следующем:
routerCanDeactivate() {
return confirm('Are you sure you want to leave this screen?');
}
Моя единственная проблема в том, что это уродливо. Он просто использует приглашение на подтверждение браузера. Я действительно хочу использовать пользовательский модальный, например, Bootstrap modal. У меня есть модальность Bootstrap, возвращающая значение true или false на основе кнопки, которую они нажимают. routerCanDeactivate
Я реализую, могу принять истинное/ложное значение или обещание, которое разрешает true/false.
Вот код для компонента, который имеет метод routerCanDeactivate
:
export class MyComponent implements CanDeactivate {
private promise: Promise<boolean>;
routerCanDeactivate() {
$('#modal').modal('show');
return this.promise;
}
handleRespone(res: boolean) {
if(res) {
this.promise.resolve(res);
} else {
this.promise.reject(res);
}
}
}
Когда мои файлы TypeScript компилируются, я получаю следующие ошибки в терминале:
error TS2339: Property 'resolve' does not exist on type 'Promise<boolean>'.
error TS2339: Property 'reject' does not exist on type 'Promise<boolean>'.
Когда я пытаюсь покинуть компонент, начинается модальный, но затем компонент деактивируется и не ждет, пока обетование решится.
Моя проблема заключается в попытке выполнить обещание, чтобы метод routerCanDeactivate
ожидал, что обещание будет разрешено. Есть ли причина, по которой возникает ошибка, указывающая, что на Promise<boolean>
нет свойства 'resolve'
? Если я смогу выполнить эту часть, то что я должен вернуть в методе routerCanDeactivate
, чтобы он ожидал разрешения/отказа от обещания?
Для справки здесь определено Определенное обещание обещания. Там явно есть функция разрешения и отклонения.
Спасибо за вашу помощь.
UPDATE
Вот обновленный файл с инициализацией Promise:
private promise: Promise<boolean> = new Promise(
( resolve: (res: boolean)=> void, reject: (res: boolean)=> void) => {
const res: boolean = false;
resolve(res);
}
);
и handleResponse
:
handleResponse(res: boolean) {
console.log('res: ', res);
this.promise.then(res => {
console.log('res: ', res);
});
}
Он по-прежнему работает неправильно, но модальный показывается и ждет ответа. Когда вы говорите "да", он остается на компоненте. Кроме того, первый res
, который регистрируется, является правильным значением, возвращаемым компонентом, но функция внутри внутри .then
не совпадает с той, которая была передана функции handleResponse
.
Дополнительные обновления
После выполнения большего числа показаний в объявлении promise
он устанавливает значение resolve
, а promise
имеет это значение независимо от того, что. Поэтому, хотя позже я вызываю метод .then
, он не меняет значение promise
, и я не могу сделать его истинным и переключить компоненты. Есть ли способ сделать promise
не иметь значения по умолчанию и что он должен ждать, пока его метод .then
не будет вызван?
Обновленные функции:
private promise: Promise<boolean> = new Promise((resolve, reject) => resolve(false) );
handleResponse(res: any) {
this.promise.then(val => {
val = res;
});
}
Еще раз спасибо за помощь.
Последнее обновление
После рассмотрения многих предложений я решил создать класс Deferred
. Он работал очень хорошо, но когда я делаю deferred.reject(anyType)
, я получаю сообщение об ошибке в консоли:
EXCEPTION: Error: Uncaught (in promise): null
То же самое происходит, когда я перехожу в null
, a string
или boolean
. Попытка предоставить функцию catch
в классе Deferred
не работает.
Отложенный класс
export class Deferred<T> {
promise: Promise<T>;
resolve: (value?: T | PromiseLike<T>) => void;
reject: (reason?: any) => void;
constructor() {
this.promise = new Promise<T>((resolve, reject) => {
this.resolve = resolve;
this.reject = reject;
});
}
}