2013-05-29 6 views
3

Я пытаюсь обмотать голову вокруг ресурсов Ember, но я ударяю о стену. Глядя на гидах, как Rails + Ember.js я вижу желаемый способ объявления маршрута ресурсов является:Правильная декларация маршрута ресурса Ember.js

EmberTester.Router.map(function() { 
    this.resource('posts', function() { 
    this.resource('post', { path: ':post_id' }); 
    }); 
}); 

Это кажется очень запутанным, имея создать вложенный ресурс для доступа отдельных элементов. Но помимо элемента стиля, реальной проблемой является поведение: такой маршрут, из того, что я могу видеть в журнале серверов, и на мониторе трафика браузера клиента оценивает крючки модели как для маршрута сообщений, так и для сообщения 'маршрут. То есть, учитывая модель крючков:

EmberTester.PostsRoute = Ember.Route.extend({ 
    model: function() { 
    return EmberTester.Post.find(); 
    } 
}); 

EmberTester.PostRoute = Ember.Route.extend({ 
    model: function(params) { 
    return EmberTester.Post.find(params.post_id); 
    } 
}); 

при посещении URL /posts/1обе модели крючки получить выполняется, поэтому сервер сначала попросил всех постов, а затем для POST_ID: 1. Мне, должно быть, не хватает очевидного, но я не могу сказать, что это такое.

Есть ли более простой способ объявить ресурсы в Ember? Должен ли я не объявить ресурсы и вместо этого использовать простые маршруты?

ответ

1

Вложение в маршрутизатор переводится в гнездо в вашем стеке. Если вам нравится иметь список сообщений слева, то отредактируйте отдельное сообщение в правой части экрана (согласно Ember Guide), тогда вложенность будет работать для вас. Если вам не нужно такое поведение, вам вообще не нужно устанавливать маршруты. Вложение, возможно, более полезно, если вам нужна соответствующая информация, например/posts/comments /, где вы никогда не найдете комментариев без какой-либо должности.

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

App.Router.map(function() { 
    this.route('posts'); 
    this.route('post', { path: '/posts/:post_id' }); 
}); 
+0

Мне не хватало важности выравнивания вложенности маршрутов с вложением вида. «Route» («posts»); route ('post', {path: '/ posts /: post_id'); 'подход отличается по смыслу от' resource ('posts', function() {route ('post' , {path: ': post_id'});}); '. Первый действует как ресурс Rails (перемещение от списка к деталям и обратно), но позже это правильный ресурс Ember для отображения в клиенте списка и выбранной детали * одновременно *. –

2

Я создал jsbin воспроизвести проблему вы говорите и изменил код router немного:

App.Router.map(function() { 
    this.resource('posts'); 
    this.resource('post', { path: '/posts/:post_id' }); 
}); 

Это точно то же самое, вложенных друг в друга маршрутов (я думаю, под капотом post является обработанный вложен).

При переходе на PostsRoute, model крюк PostsRoute уволен. Если вы нажмете на определенную должность, PostRoutemodel крючок не будет уволен.

Однако, если вы перейдете к определенной должности и обновите страницу, вы заметите, что на этот раз PostRoutemodel крючок уволен.

Вы должны использовать существительные лечения как resources (сообщения, сообщения, заказы и т. Д.) И глаголы (прилагательные) как routes (новые, показать, редактировать и т. Д.).

Надеюсь, это поможет.

+0

+1, но я принял @Gevious, потому что он указал на важность зрения вложенности для согласования с маршрута вложенности. –

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