停止 emberjs 向服务器发送加载记录的请求

mur*_*308 3 javascript ember.js ember-data

我有一个customer模型和一个product模型

客户模型

import DS from 'ember-data';
export default DS.Model.extend({
    type: DS.attr('string'),
    name: DS.attr('string'),
    product: DS.hasMany('product')
});
Run Code Online (Sandbox Code Playgroud)

产品型号

import DS from 'ember-data';
export default DS.Model.extend({
    type: DS.attr('string'),
    name: DS.attr('string'),
    customer: DS.belongsTo('customer')
});
Run Code Online (Sandbox Code Playgroud)

我将所有客户加载model()到 route.js 的钩子中,如下所示

model() {
    customers: this.store.findAll('customer'),
}
Run Code Online (Sandbox Code Playgroud)

所以到目前为止我拥有客户的所有记录。

然后使用findRecord方法我将特定产品加载为

this.store.findRecord('product', productId);
Run Code Online (Sandbox Code Playgroud)

我把这种对click一个的button发言权查找产品,这是写在controller.js

现在当我在模板中写成

{{product.customer.name}}
Run Code Online (Sandbox Code Playgroud)

它发送一个获取请求来加载已经加载的客户。我想停止该请求,我该怎么做?

据我所知

当我们已经有了记录时,store.findRecord 将立即使用缓存数据解析,但会在后台发送请求以更新记录,一旦记录更新,您的模板将显示新的更改。

我想停止那个请求。

Lux*_*Lux 5

您的问题可能是 ember-data 不知道所请求的客户已经在商店中。在您自己的回答中,您使用 url 来查看客户,所以我假设您id的 url 是您的 url,这可能是您的问题。

值得一提的是, ember-data应该按您的预期工作,所以您做错了。由于您还没有展示您的适配器、序列化程序和响应,我无法确切地告诉您出了什么问题,但我可以告诉您在哪里查看它。

另外要提到的是你有一个属性type。这可能不是你想要的,这是因为type,随着id,余烬内,你应该自己申报。

您的model钩子中似乎也存在语法错误,因为您:在对象定义中使用了like:

model() {
  customers: this.store.findAll('customer'),
}
Run Code Online (Sandbox Code Playgroud)

你必须明白这model(){}是一个函数,与model: function() {}!

应该做的是加载所有客户findAll,但必须等待承诺得到解决,直到您在产品上询问客户。所以你应该做这样的事情:

model() {
    return Ember.RSVP.hash({
        customers: this.store.findAll('customer'),
        product: this.store.find('product', 1),
    }).then(h => h.product);
}
Run Code Online (Sandbox Code Playgroud)

我建立了一个小摆弄你的情况,你看有没有对客户提出的要求,也没有显示客户。这是因为我如何模拟适配器中的服务器响应:

export default DS.JSONAPIAdapter.extend({
  findRecord (store, type, id, snapshot)  {
    console.log('find product ', id);
    return Ember.RSVP.resolve({
      data: {
        id: '2',
        type: 'product',
        attributes: { name: 'product-one'},
      }
    });
  }
});
Run Code Online (Sandbox Code Playgroud)

因为customer没有声明关系,所以 ember-data 假设它没有。让我们通过在产品中包含客户来解决这个问题:

return Ember.RSVP.resolve({
  data: {
    id: '2',
    type: 'product',
    attributes: { name: 'product-one'},
    relationships: {
      customer: {
        links: {
          related: '/customers/1'
        }
      }
    }
  }
}); 
Run Code Online (Sandbox Code Playgroud)

现在我和你的情况完全一样!Ember 联系以获取它已经拥有的客户。是因为 ember-data 不知道它有客户,因为它只知道他的 url,而不知道他的 id。这也是后台重载钩子对你不起作用的原因,因为它不是 ember-data 的重载,它是初始加载!

只需向 ember-data 提供信息即可轻松解决此问题:

customer: {
    data: { type: 'customer', id: '1' },
    links: {
        related: '/customers/1'
    }
}
Run Code Online (Sandbox Code Playgroud)

哇,一切正常!现在您甚至可以删除相关链接,因为 ember-data 可以自己构建它。

所以总而言之,解决这个问题的正确方法是调整服务器响应本身,或者使用序列化程序来修复它,以便 ember-data 可以知道它是否已经有记录。