我们正在开发教育平台。我们有两种资源类型:课程和课程。所以我们确实有以下URL架构:
/(root) └┬course-slug ├─info └┬lesson-slug └┬comments └─comment-id
课程的网址如下所示:/programming/what-is-loop/
并且本课程的评论将包含以下网址:/programming/what-is-loop/comments/
。
现在我们决定该课程是可选的。有些课程不在任何课程内,有些课程在许多课程内。所以新的URL架构如下所示:
/(root) ├┬course-slug │├─info │└┬lesson-slug │ └┬comments │ └─comment-id │ └┬lesson-slug └┬comments └─comment-id
换句话说,当然部分URL是可选的。如何使CourseRoute
成为可选项,或如何重用LessonRoute
,CommentsRoute
和CommentRoute
(实际上只有其他内容)
答案 0 :(得分:0)
如果您非常确定自己在做什么 - 这意味着在UI上您既有独立课程又有嵌套课程 - 您可以这样做(希望您理解CoffeeScript,这并不难):< / p>
@resource 'course', path: ':course_id', ->
@route 'info'
@resource 'course.lesson', ':lesson_id' ->
@resource 'lesson', ->
这会为您提供不同的路线和网址。然后你可以生成这样的链接:
{{link-to "Nested Lesson" "course.lesson" course lesson}}
{{link-to "Lesson" "lesson" lesson}}
这样,您有两条课程路线不能相同。您可以使用继承或mixin来重用功能,例如使用相同的控制器/视图/模板。
App.LessonRoute = Em.Route.extend
controllerName: 'lesson'
templateName: 'lesson' # Or use viewName if you need to define a view
model: ->
# get lesson
App.CourseLessonRoute = App.LessonRoute.extend
model: ->
# get lesson from course
# No need to define "CourseLessonController"
App.LessonController = Em.ObjectController.extend()
如果您愿意,可以使用相同的方式进行评论。但我认为你真的不需要定义一个用于评论的网址。这样您就可以使用setupController
和renderTemplate
将CommentsController
呈现给comments outlet
App.LessonRoute = Em.Route.extend
setupController: (controller, model) ->
@_super.apply(@, arguments)
comments = model.get('comments') # Just an example code to get comments
@controllerFor('comments').set 'model', comments
renderTemplate: ->
@_super.apply(@, arguments)
@render 'comments',
into: 'lesson'
outlet: 'comments'
controller: 'comments' # Not sure if this option can be ignored.
您的lesson
模板:
{{outlet comments}}
答案 1 :(得分:0)
对所有人来说!
事实证明,最简单的方法是将course-slug
移至查询参数。只需几行代码即可实现:
App.LessonRoute = Em.Route.extend
setupController: (controller, model, transition)->
controller.set 'content', model
course_slug = transition.queryParams.scope
if course_slug
...
@get('store').find('course', course_id).then (course)->
controller.set 'course', course
App.LessonController = Em.ObjectController.extend
scope: null # slug for course
queryParams: ['scope']
由于course
属性只是从课程模型转移到控制器,因此模板或其他地方不需要进行大量重构。