可选路由(URL部分)

时间:2014-03-17 12:30:41

标签: ember.js ember-router

我们正在开发教育平台。我们有两种资源类型:课程课程。所以我们确实有以下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成为可选项,或如何重用LessonRouteCommentsRouteCommentRoute(实际上只有其他内容)

2 个答案:

答案 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()

如果您愿意,可以使用相同的方式进行评论。但我认为你真的不需要定义一个用于评论的网址。这样您就可以使用setupControllerrenderTemplateCommentsController呈现给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属性只是从课程模型转移到控制器,因此模板或其他地方不需要进行大量重构。