2015-10-01 2 views
0

Чтобы объяснить проблему, с которой я столкнулся, у меня есть 2 маршрута: ApplicationRoute и SomeRoute. Мне нужно подождать ApplicationRoute, чтобы решить до, пытаясь что-то сделать с SomeRoute.Ждите разрешения ApplicationRoute перед тем, как отправиться на детский маршрут

Порядок вызова я вижу в отладке:

ApplicationRoute.model // which returns a promise 
SomeRoute.model 
SomeRoute.setupController 
ApplicationRoute.setupController 

Что я хочу:

ApplicationRoute.model // which returns a promise 
ApplicationRoute.setupController 
SomeRoute.model 
SomeRoute.setupController 

Там, наверное, подробно я пропускаю где-то ...

UPDATE

Причина, по которой я настаиваю на ApplicationRoute.setupController, чтобы иметь возможность перед другими маршрутами, я использую это для инициализации некоторых других контроллеров.

App.ApplicationRoute = Ember.Route.extend({ 
    model: function() { 
     return Ember.$.getJSON("api/settings"); 
    }, 
    setupController: function(controller, jsonSettings) { 
     this.store.pushPayload(jsonSettings); 

     this.controllerFor("foobar").set("content", this.store.all("foobar")); 
     this.controllerFor("foobaz").set("content", this.store.all("foobaz")); 
     this.controllerFor("foobam").set("content", this.store.all("foobam")); 
    } 
}); 
+0

В этом случае рассмотрите возможность вместо этого использовать логику 'setupController' в методе' afterModel'. Логически то, что вы делаете в 'setupController', не настраивает контроллер; это манипулирование и обработка модели, и поэтому по праву принадлежит одному из модельных крючков. –

+0

Тест зеленый! Огромное спасибо. Не могли бы вы добавить свой комментарий в свой ответ, чтобы я мог его принять :) –

ответ

1

Для перехода к продолжению все модели в иерархии должны быть разрешены. Так оно и должно быть; мы не хотим начинать выполнять логику приложения, которая включает в себя то, что может быть сделано в setupController, на любом уровне иерархии, в то время как необходимые модели все еще находятся на рассмотрении, и переход еще не завершен и может даже быть прервана.

Так что, если мы согласны с тем, что модели будут решены в порядке сверху вниз, что имеет смысл - в конце концов, model крючка дочернего маршрута в, возможно, захотите обратиться к this.modelFor('parent') --why является setupController называется в обратном порядке, от дна вверх? Я предполагаю, что для этого могут быть веские причины, включая жизненный цикл рендеринга, но в одном важном смысле это не имеет особого значения: правильно настроенный контроллер родительского маршрута не является обязательным условием для настройки контроллера детского маршрута , Контроллер родительского маршрута даже не доступен напрямую из контроллера детского маршрута, если вы его не вводите. Подробнее об этой теме см. http://discuss.emberjs.com/t/why-is-setupcontroller-called-after-the-model-hook-of-nested-routes/2655/9.

Как и в стороне, можно использовать выражение «маршрут разрешающий», и, кажется, подразумевают, что вызов setupController является частью этого процесса урегулирования, но было бы более правильно называть «-моделью маршрута решения» , и это не включает вызов setupController, что происходит после все модели в цепочке маршрутов разрешены и переход завершен.

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