如何使用';这';在angular中的Ajax调用中

如何使用';这';在angular中的Ajax调用中,ajax,angular,this,Ajax,Angular,This,一旦我从Ajax调用中得到响应,我就尝试使用“this”。 但“这”似乎没有定义。我发现很少有文章使用“绑定”,但我不确定如何实现绑定 在ajax调用中使用“this”没有任何问题。我从后端得到了预期的响应 saveCart(data: any): void { let body: any = {} body.data = data body = JSON.stringify(body) // the 'this' works here as expected.

一旦我从Ajax调用中得到响应,我就尝试使用“this”。 但“这”似乎没有定义。我发现很少有文章使用“绑定”,但我不确定如何实现绑定

在ajax调用中使用“this”没有任何问题。我从后端得到了预期的响应

saveCart(data: any): void {

    let body: any = {}
    body.data = data
    body = JSON.stringify(body)
    // the 'this' works here as expected.
    let config = this.config.getHeaders() as any

    $.ajax({
      url: environment.domain + '/cart',
      type: "POST",
      headers: config,
      data: body,
      contentType: "application/json",
      dataType: "json",
      async: false
    }).done(function (response) {          
      // The 'this' below is undefined **********
      this.profileService.logout().subscribe(result => {   
          console.log('User was logged out', result)
      })  
    })
  }
更新:有几个人问我为什么不使用httpClient

当用户关闭浏览器时调用此函数。使用angular的httpclient将浏览器(繁重的后端代码)冻结几秒钟,然后关闭。所以选择了ajax调用

下面是我在其他地方使用的代码,使用的是angular httpClient

  this.http.post(environment.domain + url, body, options)
      .pipe(retryWhen(this.config.handleRetry))
      .pipe(catchError(this.config.handleError))
试试这个

saveCart(data: any): void { 
/* Other code */
var that = this;
$.ajax({ 
    url: environment.domain + '/cart', 
    type:       "POST", 
    headers: config, 
    data: body, 
    contentType: "application/json",
    dataType: "json", 
    async: false,
    success:function(response){
    //The 'this' below is undefined **********
     that.profileService.logout().subscribe(result => { console.log('User was logged out', result) })
    }
 })
试着用这种方式

选项1

在Ajax调用之前,设置一个新变量

var that = this;
现在您可以使用
那个
来代替这个。它的工作原理与此相同

选项2

您可以尝试使用
ES6
语法。我没有尝试过Ajax,但我经常在代码中使用它,它对我来说很好

$.ajax({ 
url: environment.domain + '/cart', 
type:       "POST", 
headers: config, 
data: body, 
contentType: "application/json",
dataType: "json", 
async: false,
success:(() =>{  <----------------Hear is the change
    this...
}) =>{   
}
})
$.ajax({
url:environment.domain+'/cart',
类型:“POST”,
标题:config,
资料来源:body,
contentType:“应用程序/json”,
数据类型:“json”,
async:false,
成功:(()=>{
}
})

如果是Angular,那么您使用jQuery而不是Angular自己的HttpClient来进行HTTP调用的原因是什么?您可以添加如何使用HttpClient吗?这将是一种比jQuery的AjaxOnly更好的方法。只有在这种特殊情况下,我必须使用Ajax调用。其他任何地方都在使用HttpClient。所有这些都按预期工作ed.使用arrow函数语法,您就可以访问它。另外,技术上,您只需要调用一次
.pipe
,并且您可以将retryWhen和catchError等多个运算符作为参数:
.pipe(retryWhen(…),catchError(…)
不起作用。已尝试“that”您是否尝试了成功回拨而不是完成?请检查更新的答案。可能是语法错误,因为我已通过手机进行了更新。因此,为了防止语法错误,请相应地解决它。尝试了成功。没有任何区别。您能否创建一个要点或小提琴并共享它我可以测试它。这通常对所有人都有效。所以我这边有一点。我分享了相同的解决方案。但它不符合提出问题的人的要求。就个人而言,这是不可能的。可能是错误在其他地方。你怎么想?是的,第一个解决方案是相同的,但我也给出了另一个选择。我两者都在使用在我的代码中每天都有。我想这可能是代码中的一些小问题。我希望它能起作用。但不要担心,我们双方的答案都是正确的。:)编码愉快。让我们看看会发生什么。@JavaQuest有关于您的问题的更新吗?