我遇到与here所述相同的问题,但不明白它如何适用于我的情况,因为我没有“显示”路线。
我继承了这个应用程序,router.js看起来像这样:
App.Router.map(function() {
this.route('index', {
path: '/'
});
return this.resource('parent', {
path: '/:parent_id'
}, function() {
this.resource('games', {
path: '/games'
});
return this.resource('game', {
path: '/game/:game_id'
});
});
});
后端是Rails,当/游戏网址在Ember中被点击时,它会按预期调用Rails GamesController中的游戏Index操作。
游戏模板呈现每个游戏:
<ul class="gamesList">
{{#each game in sortedGames}}
{{#link-to 'game' game class='gameItem u-cf' tagName='li'}}
<div class="gameItem-name u-before6of12 u-after1of12">{{game.name}}</div>
<div class="gameItem-description u-before6of12 u-after1of12">{{game.description}}</div>
{{/link-to}}
{{/each}}
但是当点击游戏链接时,它会从Ember商店加载游戏,并且不会向API发出请求。
我需要它来向API发出请求,因为: 1.游戏列表仅包括名称和描述,因为列表可以包含许多游戏,因此我们只想为每个游戏加载一部分数据。 2.由Rails Show动作加载的单个游戏应该使用不同的序列化程序来加载单个游戏的所有附加内容(包括嵌入的子对象)。
这是游戏路线:
App.GamesRoute = Ember.Route.extend(Easypeasy.ResetScroll, {
model: ->
return this.store.find('game', {
parent: @modelFor('parent').get('slug')
})
})
这是游戏路线:
App.GameRoute = Ember.Route.extend(App.ResetScroll)
如何触发Ember加载用户点击的单个游戏?
答案 0 :(得分:4)
因此默认情况下,ember数据不会重新请求已加载的数据。如果您的父路线模型加载了一系列游戏,则需要特定游戏的子路线不会再发出请求。以下代码
select
studentmaster.name,studentmaster.totalmarks highest_marks,stream.name stream
from studentmaster,stream
where studentmaster.streamid=stream.streamid
and totalmarks in(select max(totalmarks) from studentmaster group by streamid);
将简单地查看内存中的ember-data存储并返回游戏记录。
如果您需要提出其他请求,可以通过选项
强制执行此操作this.store.findRecord('game', params.game_id)
您可以在此处了解此行为:http://emberjs.com/api/data/classes/DS.Store.html#method_findRecord
请注意我链接到ember 2.0文档,但这也适用于ember数据1。如果您正在使用ember数据&lt; 2.0,你的电话可能看起来像这样
this.store.findRecord('game', params.game_id, {reload: true});
另一种方法是在模型实例本身上调用this.store.find('game', params.game_id, {options: reload});
。如果您知道服务器上的数据已更改,并且您希望在发生某些操作后重新请求模型的数据,这也将非常有用。
最后,Ember Data 2.0提供了更多选项,您可以从商店快速加载数据,还可以在后台发出请求以获取更多信息。这可能是好的也可能是坏的,具体取决于您是希望用户看到丢失的内容,还是希望他们等待。