嵌套资源路由触发父资源路由

时间:2013-02-15 16:51:26

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

我的应用中有路由器

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'

stars.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()
)

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

在加载/ star /:id

时,您似乎不想获取所有星标

如果您直接访问/ star / 1,则获取所有星标的原因是因为star路径嵌套在stars

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

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

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