2013-02-15 3 views
2

У меня есть такой маршрутизатор в мое приложение:Уплотненный маршрут ресурсов запускает родительский ресурс маршрут

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

Когда я иду в http://localhost/#/stars я вижу в веб-консоли, что есть один запрос

GET http: // localhost: 3000/stars

И когда я иду на http://localhost/#/stars/1 я вижу в веб-консоли, что есть два запроса

GET HTTP: // локальный: 3000/звезды

GET HTTP: // локальный: 3000/Звезды/1

Вопрос: почему во втором случае есть два запроса?


Stars маршрут:

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() 
) 
+1

Это действительно не должно делать второй запрос, если у вас уже есть эта запись в 'Store'. Можете ли вы добавить определение своего «Хранилища»? у вас есть пользовательский первичный ключ? Кроме того, в «StarRoute» попробуйте изменить его на «App.store.find (« App.Star », params.star_id)». Не уверен, если это будет иметь значение, но попробуйте его – MilkyWayJoe

+0

Теперь вы можете увидеть мое определение магазина. Также я изменяю первичный ключ в json от ** _ id ** до ** id ** (из-за mongoid). Я также добавляю выход в stars.js.hdb.hamlbars. Теперь у меня есть два запроса только при загрузке первого ресурса, но если я загружаю звезды раньше, чем у меня есть только один запрос каждый раз при загрузке специальной звезды (по id) *** GET http: // localhost: 3000/stars *** – freemanoid

ответ

1

Путь вложенной работа ресурсы, если первый запрос возвращает обещание (которое уголек данные предположительно), функция вложенных ресурсов/маршрутов не будет вызываться до тех пор, пока запрос ajax не будет завершен.

Следуя этой логике, должен быть только один вызов ajax.

TravelApi.Star.find() должен создать запрос ajax для извлечения всех записей TravelApi.Star.find(1) не должен требовать запроса ajax, поскольку запись должна быть там.

В вашем случае, однако, ресурс star не ждет, когда ресурс stars закончит ajax. Причина в том, что TravelApi.Star.find() сразу возвращает результаты (все доступные записи в магазине, который, конечно, пуст), вместо обещания (я думаю).

Чтобы решить эту проблему, вы можете вернуть findQuery обещание, написав следующее в модели: TravelApi.Star.find({})

Это заставит star ресурс ждать stars ресурса, чтобы закончить его АЯКС запрос.

Маршрут должен выглядеть следующим образом:

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

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

Если я удалю ** params.star_id ** с моего маршрута, то у меня нет запроса ** id **. Так что это не сработает. – freemanoid

+0

Это маршрут звезд, а не маршрут «Звезда». Храните params.star_id в звездном маршруте. –

+0

Хорошо, я попробовал, но это не имеет никакого эффекта. Как описано выше. – freemanoid

1

кажется, что вы не хотите получать все звезды при загрузке/звезды /: идентификатор

Причины, почему все звезды если вы получаете доступ/star/1 напрямую, потому что маршрут star вложен внутри stars

Причина, по которой вы планировали свои маршруты, объясняется тем, что ваш пользовательский интерфейс является вложенным. Это означает, что когда вы смотрите на одну звезду, где-то в вашем пользовательском интерфейсе (возможно, в боковой панели), вы показываете список звезд. В этом случае вам нужен запрос localhost:3000/stars, потому что вам нужно отображать все звезды, даже если вы смотрите на одну звезду. Это означает, что запрошенный ajax необходим и, следовательно, не является проблемой.

Если, однако, вы не показываете список всех звезд при взгляде на одну звезду, то ваши маршруты не должны быть вложенными в первую очередь. В этом случае исправьте свои маршруты, чтобы они выглядели так:

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

Хорошо, я догадался. Но если я уже загружаю все звезды, почему этот запрос (по id) загружает все снова вместо чтения из памяти? – freemanoid

Смежные вопросы