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 将立即使用缓存数据解析,但会在后台发送请求以更新记录,一旦记录更新,您的模板将显示新的更改。
我想停止那个请求。
您的问题可能是 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 可以知道它是否已经有记录。