【发布时间】:2016-08-05 05:36:38
【问题描述】:
我正在尝试将routerCanDeactivate 函数用于我的应用程序中的组件。简单的使用方法如下:
routerCanDeactivate() {
return confirm('Are you sure you want to leave this screen?');
}
我唯一的问题是它很难看。它只是使用浏览器生成的确认提示。我真的很想使用自定义模式,比如 Bootstrap 模式。我让 Bootstrap 模式根据他们单击的按钮返回真值或假值。我正在实现的routerCanDeactivate 可以接受真/假值或解析为真/假的承诺。
下面是具有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>'.
当我尝试离开组件时,模式启动,但随后组件停用并且不等待承诺解决。
我的问题是试图解决 Promise,以便 routerCanDeactivate 方法等待 Promise 解决。是否有错误提示 'resolve' 上没有 Promise<boolean> 属性的原因?如果我可以解决这部分问题,我必须在 routerCanDeactivate 方法中返回什么,以便它等待承诺的解决/拒绝?
供参考,here is the DefinitelyTyped Promise definition。那里显然有一个解决和拒绝功能。
感谢您的帮助。
更新
这是更新后的文件,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 的值,我也无法使其成为 true 并切换组件。有没有办法让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、string 或boolean 时,也会发生同样的事情。尝试在 Deferred 类中提供 catch 函数不起作用。
延迟类
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;
});
}
}
【问题讨论】:
-
我可能错了,因为我不知道打字稿,但你不应该先初始化
this.promise吗?更准确地说,您不应该返回一个承诺,并保留其resolve和reject函数的引用,然后调用这些函数吗? -
@Amit 你是对的,我更新了原帖。
-
什么是调用句柄响应?
-
@iliacholy 这是一个在模态关闭时调用的函数。这是我制作的 Angular 2 模态组件的输出。我还确认它被正确调用并且响应正在到来。
-
不是您问题的答案,但您的承诺定义非常冗长。可以是
private promise = new Promise<boolean>((resolve, reject) => resolve(false));
标签: typescript angular