我正在尝试在我的应用中为组件使用routerCanDeactivate
函数。使用它的简单方法如下:Angular 2和TypeScript Promises
routerCanDeactivate() {
return confirm('Are you sure you want to leave this screen?');
}
我唯一的问题就是它很丑。它只是使用浏览器生成的确认提示。我真的想使用自定义模式,比如Bootstrap模式。我有Bootstrap模式根据他们点击的按钮返回true或false值。我正在实施的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);
}
}
}
当我的打字稿文件编译,我得到的终端以下错误:
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
方法中返回什么,以便等待解决方案/拒绝承诺?
仅供参考,here is the DefinitelyTyped Promise definition。那里显然有决心和拒绝功能。
感谢您的帮助。
UPDATE
下面是更新后的文件,与无极初始化:
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
这同样的事情发生,一个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;
});
}
}
我可能是错的,因为我不知道打字稿,但你不应该先初始化* *'这一点。 promise'?更准确地说,你不应该返回一个承诺,并继续参考它的“决定”和“拒绝”功能,然后调用它们吗? – Amit
@提醒你是正确的,我更新了原文。 – pjlamb12
什么是调用句柄响应? –