我的应用中有路由器:
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()
)
答案 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' }