Ответ 1
Вы ошибетесь.
Эмбер зависит от иерархии вложенных точек, которые соответствуют иерархии маршрутов. Таким образом, каждый раз, когда вы нажимаете ссылку, которая ведет вас к детскому маршруту, дочерний маршрут должен отображаться в виде выходного файла в его родительском шаблоне. Если вы всегда визуализируетесь в одном шаблоне и розетке, Ember не сможет правильно обновлять выходы при повторном перемещении по иерархии маршрутов. (Надеюсь, это имеет смысл.)
Чтобы избежать этой проблемы, хорошим правилом является использование параметра into
для отображения шаблонов, которые вы управляете за пределами иерархии маршрутов. Например, я использую его для рендеринга модальных представлений, у которых нет URL-адреса, и который я ругаю вручную. В иерархии представлений вы почти всегда можете избежать использования into
. Например, если вам нужно отобразить несколько шаблонов с отдельным контроллером, вы можете использовать помощник {{render}}
в своем шаблоне вместо вызова render
в вашем маршруте.
В этом случае самое простое решение, вероятно, должно соответствовать вашему вложенности маршрутов для размещения вашего шаблона. Ваш маршрут animals/index
и pets
- это действительно братья и сестры, а не parent-child, а также для pets/list
и вашего pets/new
. Фактически, это по умолчанию, но несколько скрытое поведение: вы действительно должны использовать pets/index
для отображения списка вместо родительского маршрута pets
.
App = Ember.Application.create({});
App.Router.map(function(){
this.resource("animals", function(){
// this.route("index"); at path /animals is implicit
this.resource("pets", function(){
// this.route("index"); at path /animals/pets is implicit
this.route("new")
})
})
});
// You don't really need any of these route definitions now;
// I'm including them for clarity
App.AnimalsRoute = Ember.Route.extend();
App.AnimalsIndexRoute = Ember.Route.extend();
App.PetsRoute = Ember.Route.extend();
App.PetsIndexRoute = Ember.Route.extend();
App.PetsNewRoute = Ember.Route.extend();
// Not sure why you need to use a custom template name here,
// but it should work fine
App.PetsView = Ember.View.extend({
templateName : 'wild/pets'
});
С шаблонами:
<!-- animals gets rendered into this outlet -->
<script type="text/x-handlebars" data-template-name="application">
<h1>{{#linkTo "animals"}}Hello from Ember.js</h1>{{/linkTo}}
{{outlet}}
</script>
<!-- animals/index and pets get rendered into this outlet -->
<script type="text/x-handlebars" data-template-name="animals">
{{outlet}}
</script>
<!-- no outlet here because animals/index has no child routes -->
<script type="text/x-handlebars" data-template-name="animals/index">
{{#linkTo "pets"}}This is animals list{{/linkTo}}
</script>
<!-- pets/index and pets/new get rendered into this outlet -->
<script type="text/x-handlebars" data-template-name="wild/pets">
{{outlet}}
</script>
<script type="text/x-handlebars" data-template-name="pets/index">
{{#linkTo "pets.new"}}This is pets list{{/linkTo}}
</script>
<script type="text/x-handlebars" data-template-name="pets/new">
This is pet creation
</script>