2

アプリにそのようなルーターがあります:

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

に行くとhttp://localhost/#/stars 、Web コンソールに 1 つのリクエストがあることがわかります

GET http://localhost:3000/stars

に行くとhttp://localhost/#/stars/1 、Web コンソールに 2 つのリクエストがあることがわかります

GET http://localhost:3000/stars

GET http://localhost:3000/stars/1

質問: 2 番目のケースで 2 つの要求があるのはなぜですか?


スターズルート

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.コーヒー

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

2 に答える 2

1

/ star /:idをロードするときに、すべての星を取得したくないようです。

/ star / 1に直接アクセスした場合にすべてのスターがフェッチされる理由は、starルートが内部にネストされているためです。stars

ルートをネストする理由は、UIがネストされているためです。これは、UIのどこか(おそらくサイドバー内)で1つの星を見ているときに、星のリストを表示していることを意味します。その場合、localhost:3000/stars1つ星を見ている場合でも、すべての星を表示する必要があるため、リクエストが必要です。これは、要求されたajaxが必要であり、したがって問題がないことを意味します。

ただし、1つの星を見たときにすべての星のリストを表示していない場合は、最初にルートをネストしないでください。その場合は、ルートを次のように修正します。

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

ネストされたリソースが機能する方法では、最初のリクエストが promise を返す場合 (これは ember データが行うはずです)、ネストされたリソース/ルート モデル関数は、ajax リクエストが完了するまで呼び出されません。

このロジックに従うと、ajax 呼び出しは 1 つだけになります。

TravelApi.Star.find()すべてのレコードを取得する ajax リクエストを作成する TravelApi.Star.find(1)必要があります。レコードが存在する必要があるため、ajax リクエストは必要ありません。

ただし、あなたの場合、リソースはリソースがajax を終了するのをstar待っていません。starsその理由はTravelApi.Star.find()、約束ではなく、すぐに結果を返すことです (ストア内のすべての利用可能なレコードで、もちろん空です)。

これを解決するには、モデルに次のように記述して、findQuery promise を返すことができます。 TravelApi.Star.find({})

これにより、リソースは、リソースが ajax リクエストを完了するstarまで待機します。stars

ルートは次のようになります。

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 に答える