这个问题已经在这里有了答案:

我是新手,尝试快速学习,但对发生的事情感到困惑。 当加载我的TS文件,它就会从http.get请求和存储邮件列表他们诠释,他的变量conversation 但是,当我添加新消息时,它是将其添加到我的API中并返回结果,但是当我尝试将消息添加到对话中时,却收到了错误消息

this.insertMessage是未定义的

但是功能已设定。 请参见下面的代码。 我假设当您尝试在.subscribe方法的complete函数中调用函数时,您无法访问外部函数。 那是对的吗?

export class MessagePage {

  newmessage;
  conversation;

  id;
  response: {};

  ionViewWillEnter(){
    this.getMessage(this.id);
  }

  // public messageArr;
  constructor(public navCtrl: NavController, public navParams: NavParams, public messageService: MessagesProvider) {
    this.id = navParams.get('id');
  }

  addmessage(): void {
    this.messageService.addMessage(this.newmessage,this.id)
      .subscribe( 
        function(response) { console.log("Success Response" + response); this.response = response;},
        function(error) { console.log("Error happened" + error)},
        function() {     
          if(this.response.result == 200) this.insertMessage(this.response.response.message);
          else console.error(this.response);
        }
      );
  }

  getMessage(id: number): void {
    this.messageService.getMessage(id)
      .subscribe(message => this.conversation = message);
  }

  insertMessage(message): void {
    console.log('conversation:'+ this.conversation);
    this.conversation.push(message);
  }

  ionViewDidLoad() {
    console.log('ionViewDidLoad MessagePage');
  }

}

#1楼 票数:1 已采纳

使用更现代的箭头功能( () => {} )语法代替旧的普通功能语法( function () {} )来保留this的范围。

由于范围this在回调函数改变, this不是指你的MessagePage了。

使用箭头functions( () => {} )语法将保留this的范围。

使用此解决方法:

addmessage(): void {
  this.messageService.addMessage(this.newmessage, this.id)
    .subscribe(
      response => this.response = response,
      error => console.log("Error happened" + error),
      () => {
        if (this.response.result == 200) 
          this.insertMessage(this.response.response.message);
        else console.error(this.response);
      }
    );
}

#2楼 票数:0

您可以像下面这样简单地访问外部范围

  addmessage(): void {
     var self=this;

    this.messageService.addMessage(this.newmessage,this.id)
      .subscribe( 
        function(response) { console.log("Success Response" + response); this.response = response;},
        function(error) { console.log("Error happened" + error)},
        function() {     
          if(this.response.result == 200) self.insertMessage(this.response.response.message);
          else console.error(this.response);
        }
      );
  }

  ask by jcsbrotha translate from so

未解决问题?本站智能推荐:

2回复

Ionic,Angular-ChangeDetectorRef未定义

我正在导入ChangeDetectorRef,如下所示: 并在我的页面的构造函数中初始化更改检测器,如下所示: 但是当我在回调函数中执行detectChanges()时: 它说“无法读取属性'detectChanges'未定义”。 我能错过什么? 编辑: 从模态调用回调。
1回复

获取请求TypeError:这是未定义的

我有两个功能: 这个检查用户名是否已经在数据库中使用: 这个检查电子邮件是否已经在数据库中使用: 而且我有此功能,如果存在电子邮件/用户名,则会执行一些弹出窗口和提示 这是AuthService提供程序中的getDataz函数: 我这样调用这些树函数: 这是错误日志:
1回复

无法读取Ionic2中未定义的属性“contentHeight”

我需要在Ionic 2页面上获得scrollTop位置,但是使用简单的jQuery却无法正常工作。 在下面查看我的工作示例,滚动页面并单击它,它将为您提供y位置编号。 $("body").click(function(){ var scrollPost = $(document).s
3回复

离子本机http获取返回typeError-无法读取未定义的属性“match”

几分钟前,我在最新的Ionic中创建了一个新项目。 我进口了 之后,我尝试将GET请求发送到我的后端应用程序。 我正在使用“离子cordova运行浏览器”命令。 我尝试在android上运行,但效果相同。 在每种情况下,我都会出错:
1回复

NgZone/Angular2/Ionic2TypeError:无法读取未定义的属性'run'

我收到此错误TypeError:无法在Subscriber.js中读取未定义的属性'run':229并且不知道为什么 - 在离子beta 10中这个代码工作正常...在11中没有。
1回复

Ionic3和Angular4-无法读取未定义的属性级别

用户可以创建一种语言并选择其级别。 但是,当该页面加载时,我收到一条错误消息,提示“无法读取未定义的属性'级别'”。 我认为是因为还没有创建语言对象? 我如何初始化一个,而不将语言对象的每个属性设置为“”或null或false。 解决我的问题的最佳方法是什么? 我尝试使用? 运
2回复

无法读取ReactiveForm中未定义的属性“控件”

我试图用Ionic 3中的嵌套表格概念制作一个反应形式。 但是我收到一个错误: '无法读取未定义'的属性'控件'。 如果有人能解决我的问题,那将是件好事。 我尝试通过注释不同的输入选项卡来解决问题,但它不起作用。 这是我的TS文件: Selectedseats来自上一​​页
2回复

Angular在发送之前获取原始http请求

我试图在发送到服务器之前获取HTTP请求。 我的第一次尝试是像这样写一个HttpIntercepter 这很好,但不是我想要的。 我希望将最终组合请求作为原始文本而不是对象。 目前控制台输出看起来像这样 正如你所看到的,我没有得到任何信息。 我看不出设置了多少或哪些值。