2

我的应用程序中有这样的路由器

TravelApi.Router.map ->
  @resource 'stars', ->
    @resource 'star', { path: '/:star_id' }

当我去时,http://localhost/#/stars 我在 Web 控制台中看到有一个请求

获取 http://localhost:3000/stars

当我去时,http://localhost/#/stars/1 我在 Web 控制台中看到有两个请求

获取 http://localhost:3000/stars

获取 http://localhost:3000/stars/1

问题:为什么第二种情况有两个请求?


明星路线

TravelApi.StarRoute = Ember.Route.extend(
  model: (params) ->
    TravelApi.Star.find(params.star_id)
)

TravelApi.StarsRoute = Ember.Route.extend(
  model: ->
    TravelApi.Star.find()
)

还有我的模板:application.js.hbs.hamlbars

= hb "linkTo 'stars'" do
  stars
%div= hb 'outlet'

星星.js.hbs.hamlbars

%ul
  =hb "each star in controller" do
    %li<
      =hb 'star.name'

star.js.hbs.hamlbars

Star:
= hb 'name'

存储.js.coffee

TravelApi.store = DS.Store.create(
  revision: 11
  adapter: DS.RESTAdapter.create()
)
4

2 回答 2

1

嵌套资源的工作方式,如果第一个请求返回一个 Promise(ember 数据应该这样做),则在 ajax 请求完成之前不会调用嵌套资源/路由模型函数。

按照这个逻辑,应该只有 1 个 ajax 调用。

TravelApi.Star.find()应该创建一个 ajax 请求来获取所有记录 TravelApi.Star.find(1)不应该需要一个 ajax 请求,因为记录应该在那里。

但是,在您的情况下,star资源不会等待stars资源完成 ajax。原因是TravelApi.Star.find()立即返回结果(商店中的所有可用记录当然是空的),而不是承诺(我认为)。

为了解决这个问题,您可以通过在模型中编写以下内容来返回 findQuery 承诺: TravelApi.Star.find({})

这将导致star资源等待stars资源完成其 ajax 请求。

路线应如下所示:

TravelApi.StarsRoute = Ember.Route.extend
  model: ->
    TravelApi.Star.find({})

TravelApi.StarRoute = Ember.Route.extend
  model: (params) ->
    TravelApi.Star.find(params.star_id)
于 2013-02-15T19:36:44.233 回答
1

加载 /star/:id 时,您似乎不想获取所有星星

直接访问 /star/1 会获取所有星星的原因是star路由嵌套在里面stars

您嵌套路由的原因是因为您的 UI 是嵌套的。这意味着当您查看一颗星星时,在您的 UI 中的某个位置(可能在侧边栏中),您正在显示星星列表。在这种情况下,您需要该请求localhost:3000/stars,因为即使您正在查看一颗星星,您也需要显示所有星星。这意味着请求的 ajax 是必要的,因此不是问题。

但是,如果您在查看一颗星星时没有显示所有星星的列表,那么您的路线首先不应该嵌套。在这种情况下,将您的路线修复为如下所示:

TravelApi.Router.map ->
  @resource 'stars'
  @resource 'star', { path: '/:star_id' }
于 2013-02-19T16:00:45.410 回答