You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

成功执行Ajax POST后更新Ember Data Store的问题

解决方案

这是JavaScript上下文绑定的典型问题,在Ember场景下有几种简单可靠的解决方式:

方法1:使用jQuery Ajax的context参数

jQuery的Ajax方法内置了context选项,你可以直接将组件实例传入,这样回调函数里的this就会指向组件:

$.ajax({
  contentType: "application/json",
  method: "POST",
  data: JSON.stringify(data),
  processData: false,
  url: url,
  context: this, // 关键:指定上下文为组件实例
  success: this.actions.update,
  beforeSend: function() { },
  error: function() { }
});

修改后你的update方法里的this就能正确指向组件,this.get('store')自然就能正常工作了。

方法2:用箭头函数包裹回调

箭头函数会继承外层作用域的上下文,你可以把success回调换成箭头函数,在里面调用你的update方法:

$.ajax({
  contentType: "application/json",
  method: "POST",
  data: JSON.stringify(data),
  processData: false,
  url: url,
  success: (responseData) => this.actions.update.call(this, responseData),
  beforeSend: function() { },
  error: function() { }
});

这里用call(this)确保update方法内部的this也是组件实例,或者如果你的update方法本身是用箭头函数定义的,直接调用即可。

方法3:提前保存上下文到变量

在发起Ajax请求前,把组件的this存到一个变量中,然后在回调里使用这个变量:

const component = this;
$.ajax({
  contentType: "application/json",
  method: "POST",
  data: JSON.stringify(data),
  processData: false,
  url: url,
  success: function(data) {
    component.actions.update.call(component, data);
  },
  beforeSend: function() { },
  error: function() { }
});

额外推荐:使用Ember风格的Promise处理

其实在Ember中,更推荐利用Ember.$.ajax返回的Promise结合箭头函数,代码会更简洁直观,同时避免上下文问题:

Ember.$.ajax({
  contentType: "application/json",
  method: "POST",
  data: JSON.stringify(data),
  processData: false,
  url: url
}).then((data) => {
  this.get('store').pushPayload({
    item: {
      id: data.item.id,
      title: data.item.title,
      images: data.images
    }
  });
}).catch((error) => {
  // 这里可以添加错误处理逻辑
  console.error('请求失败:', error);
});

这种方式不需要单独定义update action,直接在then回调里完成Store更新,箭头函数自动绑定了组件的上下文,非常省心。


内容的提问来源于stack exchange,提问作者Bitwise

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:15:37