我正在使用Ionic2和Meteor。但是,我确实有一个与this
对象范围相关的Javascript / Typescript问题。
我有read我应该使用bind
,因为我没有在适当级别处理this
。
我可能不理解这个概念,因为我尝试以下操作,但尝试调用函数时出错。
this.subscribe('messages', this.activeChat._id, this.senderId, () => {
this.autorun(() => {
let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
promiseMessages.then((messageData: Mongo.Collection<Message>) => {
messageData.find().forEach(function (message: Message) {
setLocalMessage.bind(message);
});
});
});
和
private setLocalMessage(message: Message): void {
this.localMessageCollection.insert(message);
}
当我尝试构建应用时出现以下错误:
ERROR in ./app/pages/messages/messages.ts (72,19): error TS2304: Cannot find name 'setLocalMessage'.
更新
感谢您提供以下建议。
我现在正在使用以下内容,它确实有效。
let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
promiseMessages.then((messageData: Mongo.Collection<Message>) => {
messageData.find().forEach((message: Message) => {
this.setLocalMessage(message);
});
});
答案 0 :(得分:2)
我已经读过,如果我没有在适当的级别处理此问题,我应该使用
bind
。
现在有点过时,最好看看How to access the correct `this` context inside a callback?这些日子,它们还会向您展示如何使用箭头功能。
您收到错误消息是因为setLocalMessage
不是变量,但仍然是this
的属性,因此您必须按原样访问它。在您的案例中基本上有三种解决方案:
bind
messageData.find().forEach(this.setLocalMessage.bind(this));
forEach
的上下文参数(假设它是Array
方法):
messageData.find().forEach(this.setLocalMessage, this);
另一个箭头功能:
messageData.find().forEach((message: Message) => {
this.setLocalMessage(message);
});
答案 1 :(得分:1)
这里有一些问题。
在ES6(以及TypeScript)中,您需要使用显式引用实例成员,例如this.setLocalMessage
。无论代码在哪里,只写setLocalMessage
无效。
在function
内,this
对象可能不是您所期望的。您需要从函数外部捕获this
对象并将其放在变量中,如下所示:
this.subscribe('messages', this.activeChat._id, this.senderId, () => {
this.autorun(() => {
let self = this;
let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
promiseMessages.then((messageData: Mongo.Collection<Message>) => {
messageData.find().forEach(function (message: Message) {
self.setLocalMessage(message);
});
});
});
或者,您可以使用箭头表达式,其中this
与围绕它的代码中的this.subscribe('messages', this.activeChat._id, this.senderId, () => {
this.autorun(() => {
let promiseMessages: Promise<Mongo.Collection<Message>> = this.findMessages();
promiseMessages.then((messageData: Mongo.Collection<Message>) => {
messageData.find().forEach(message => this.setLocalMessage(message));
});
});
});
相同:
<?xml version="1.0" encoding="UTF-8"?>
这不是TypeScript本身的问题。没有它,代码将在运行时失败。