【问题标题】:Ember js how to force reload of specific selected record?Ember js如何强制重新加载特定的选定记录?
【发布时间】:2016-05-03 17:24:18
【问题描述】:

我遇到了与here 所述相同的问题,但不明白它如何适用于我的情况,因为我没有“显示”路线。

我继承了这个app,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 中点击 /games url 时,它会按预期调用 Rails GamesController 中的 games 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 加载用户点击的单个游戏?

【问题讨论】:

    标签: javascript ruby-on-rails ember.js ember-data


    【解决方案1】:

    所以默认情况下 ember 数据不会重新请求它已经加载的数据。如果你的父路由的模型加载了一个游戏数组,那么需要特定游戏的子路由不会再发出请求。以下代码

    this.store.findRecord('game', params.game_id)
    

    将简单地查看内存中的 ember 数据存储并返回游戏记录。

    如果您需要发出另一个请求,您可以通过选项强制该行为

    this.store.findRecord('game', params.game_id, {reload: true}); 
    

    您可以在此处阅读有关此行为的信息:http://emberjs.com/api/data/classes/DS.Store.html#method_findRecord

    请注意,我链接到 ember 2.0 文档,但这也适用于 ember 数据 1。如果您使用

    this.store.find('game', params.game_id, {options: reload});
    

    另一种方法是在模型实例本身上调用reload()。如果您知道服务器上的数据已更改,并且您希望在发生某些操作后重新请求模型的数据,这也将证明是有用的。

    最后,Ember Data 2.0 提供了更多选项,您可以在其中快速加载存储中的数据,还可以在后台发出请求以获取更多信息。这可能是好是坏,取决于您是否希望您的用户看到丢失的内容,或者您​​是否希望他们等待。

    【讨论】:

    • 感谢您的快速回复,但我觉得奇怪的是代码中没有这行:this.store.findRecord('game', params.game_id)。如果它不做 findRecord,它是如何从商店加载它的?我尝试将其添加到 GameRoute (您可以在上面看到基本上是空的),但这会产生错误(无法读取未定义的属性“查找”)
    • 对不起,它给出了这个错误:处理路线时出错:游戏 this.store.findRecord 不是一个函数 - 我想这是因为我在 ember 1.12 上。因此,我尝试了您为 ember
    • 好的,我通过将参数添加到函数参数来修复该错误,现在我得到另一个错误:未定义游戏重新加载
    • 通过阅读这篇文章终于找到了解决方案:discuss.emberjs.com/t/force-store-to-reload-data-from-api/4441/… 需要从游戏列表模板中传递game.id,而不是完整的游戏模型。然后不得不使用fetchById,而不是find。
    猜你喜欢
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多