Ember-CLI Routing: изменили структуру моего маршрута/шаблона, но сборка не распознает изменения?

Я только что изменил структуру маршрута в ember-cli и сломал свое приложение. Я хотел вложить свою текущую структуру на один уровень глубже...

До:

Router.map(function() {
    this.resource('placements', function() {
        this.route('add');
        this.route('import');
        this.route('open');
    });
    this.route('admin');
});

После:

Router.map(function() {
    this.resource('portal', function() {
        this.resource('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

Структура моего шаблона также должна была измениться...

До:

- templates/
-     placements/
-         add.hbs
-         import.hbs
-         index.hbs
-         open.hbs
-     admin.hbs
-     application.hbs
-     index.hbs
-     placements.hbs

После:

- templates/
-     portal/
-         placements/
-             add.hbs
-             import.hbs
-             index.hbs
-             open.hbs
-         admin.hbs
-         index.hbs
-         placements.hbs
-     application.hbs
-     index.hbs
-     portal.hbs

Я думал, что сделал все изменения 1-в-1, но по какой-то причине, когда я перезапустил сервер ember, вложенные маршруты «размещения» были нарушены.

В журнале консоли я заметил, что ember все еще пытается найти placements.index в старом templates/placements/index, а не в новом каталоге.

Есть одна теория, что шаблоны не могут быть вложены так же, как маршрутизатор? Это означает, что мне может понадобиться явно определить каждый маршрут с помощью renderTemplate хука чтобы он отображал правильный шаблон... это может быть проблемой, потому что этот проект будет довольно большим... возможно, я делаю что-то еще неправильно?


person Grapho    schedule 03.07.2014    source источник
comment
Я не уверен, что вам нужно вложить каталог шаблонов. Я думаю, что Ember не выполняет разрешение шаблона более чем на один уровень, даже если маршрут вложен более чем на один уровень.   -  person Adam    schedule 03.07.2014
comment
Если это так, то это объясняет проблему... но тогда как определить такую ​​вложенную структуру, чтобы ember мог найти правильные шаблоны?   -  person Grapho    schedule 03.07.2014
comment
Я думаю, что разрешение шаблона Ember всегда соответствует templates/resource/route.hbs. Даже если ресурс в пути вложен по другой причине. Это похоже на то, как при переходе на маршрут вы всегда будете идти, например, route.transitionTo('placements.add') вместо route.transitionTo('portal.placements.add'). Я думаю, что идея состоит в том, чтобы уменьшить связь между логикой приложения и структурой URL-адреса, чтобы URL-адреса можно было изменить без необходимости полностью менять логику в приложении.   -  person Adam    schedule 03.07.2014
comment
@Adam Проблема в том, что placements.hbs имеет {{output}}, а внутри него по умолчанию есть индекс и 3 другие страницы (добавить, импортировать, открыть), которые отображаются внутри него ... теперь, поднимая каталог placements/, он убивает placements.hbs и вместо этого просто отображает index.hbs... Надеюсь, это имеет смысл   -  person Grapho    schedule 03.07.2014
comment
возможно, мое понимание того, как это работает, ошибочно с самого начала... однако оно работало нормально, когда был только один уровень глубины   -  person Grapho    schedule 03.07.2014
comment
Хорошо, я понял это! @ Адам прав, хотя мне это не казалось интуитивно понятным, пока я не поиграл с ним больше.   -  person Grapho    schedule 04.07.2014


Ответы (1)


После работы над комментариями @Adam оставил меня. Я смог выяснить, как правильно работать с шаблонами.

Шаблоны действительно не вложены точно в тот же шаблон, что и ресурсы/маршруты.

Учитывая новую структуру маршрута, которую я создал:

Router.map(function() {
    this.resource('portal', function() {
        this.resource('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

Шаблоны должны иметь следующую структуру:

- templates/
-     placements/
-         add.hbs
-         import.hbs
-         index.hbs
-         open.hbs
-     portal/
-         admin.hbs
-         index.hbs
-     application.hbs
-     index.hbs
-     placements.hbs
-     portal.hbs

Когда вы определяете «ресурс», это по существу делает этот конкретный маршрут объектом верхнего уровня, независимо от того, насколько глубоко он вложен в карту маршрутизатора. placements.hbs и portal.hbs (сверху) являются шаблонами "ресурсов" (верхнего уровня) и соответственно размещаются на верхнем уровне каталога шаблонов.

Поскольку у каждого из этих двух "ресурсных" шаблонов есть {{outlet}}, "дочерние" шаблоны маршрутов необходимо поместить в каталог верхнего уровня, который назван в честь соответствующего ресурса.

Документы Ember-CLI описывают этот шаблон, показывая пример только на один уровень в глубину, поэтому я сначала предположил, что шаблон повторяется, углубляясь. Я надеюсь, что это поможет прояснить фактический путь для всех, кто изучает Ember.


Обновлять:

Начиная с EMBER 1.7.0

Теперь маршруты можно вкладывать друг в друга!

Это захватывающая новость для меня лично, но она заслуживает обновления этого ответа.

Ресурсы по-прежнему можно использовать, как в приведенном выше примере, поэтому, если вас это устраивает, вы можете продолжать в том же духе некоторое время. Но имейте в виду, ресурсы запланированы на возможный путь к устареванию. В конце концов, будут только маршруты и вложенные маршруты.

Хорошей новостью является то, что если вы будете следовать новому шаблону, вы сможете более естественно вкладывать свои шаблоны, чтобы они соответствовали структуре вашего маршрутизатора, как и должно быть в естественном приложении в стиле REST. Больше никаких неудобных ментальных карт.

Например, этот же маршрутизатор сверху (с небольшими изменениями):

Router.map(function() {
    this.route('portal', function() {
        this.route('placements', function() {
            this.route('add');
            this.route('import');
            this.route('open');
        });
        this.route('admin');
    });
});

Шаблоны могут быть структурированы следующим образом:

- templates/
-     portal/
-         placements/
-             add.hbs
-             import.hbs
-             index.hbs
-             open.hbs
-         admin.hbs
-         index.hbs
-         placements.hbs
-     application.hbs
-     index.hbs
-     portal.hbs

Тот же шаблон применяется к вложению соответствующих /routes, /controllers, /adapters и т. д. и т. д.

Это также означает (с этим новым шаблоном), что {{link-to}} помощники и transitionTo методы должны будут включать полный путь маршрута: например. {{link-to 'portal.placements.index'}}.

person Grapho    schedule 03.07.2014
comment
Grapho спасибо за ваши ценные исследования по этой теме. Поскольку я собираюсь выбрать, какую стратегию использовать, не могли бы вы сказать, где вы читали об устаревании использования ресурсов? - person masciugo; 06.11.2014
comment
@masciugo я стараюсь следить за сообщениями в блоге на emberjs.com/blog, где они делают объявления о разработке и изменения. Я также нахожусь в IRC #emberjs и тоже много слышу там - person Grapho; 06.11.2014