【问题标题】:Using transitionToRoute with a model with a custom slug将 transitionToRoute 与带有自定义 slug 的模型一起使用
【发布时间】:2014-02-26 16:44:39
【问题描述】:

我有一个 ember-data 模型,它有一个 id 以及一个服务器生成的自定义 slug 属性(如果重要的话,它的前缀是 id)。

我想在所有公共路由中使用slug 而不是id。为此,我更改了路由器:

App.Router.map ->
  @resource 'strategies', path: '/strategies', ->
    @resource 'strategy', path: ':strategy_slug'

并覆盖了相应路由的serialize方法:

App.StrategyRoute = Ember.Route.extend()
  serialize: (model) ->
    {
      strategy_slug: model.get('slug')
    }

不幸的是,当使用控制器中的 transitionToRoute 转换到例如 /strategies/123-test 时,这似乎不起作用:

App.ExampleController = Ember.ObjectController.extend()

  [...]

  actions:
    showDetails: ->
      @transitionToRoute("/strategies/#{@get('slug')}")
      false

(其中@get('slug') 返回'123-test'

调用showDetails 操作后我在控制台中得到的所有输出是:

Transitioned into 'strategies.index'

Ember 似乎确实可以识别基于 slug 的路线。

Ember: 1.5.0-beta.2+pre.3ce8f9ac
Ember Data: 1.0.0-beta.6

有什么我可能错过的吗?

编辑:

以下变体在这种情况下有效并且可行,但我还有另一个用例,我只能访问 URL。

App.ExampleController = Ember.ObjectController.extend()

  [...]

  actions:
    showDetails: ->
      @transitionToRoute('strategy', @get('content'))
      false

【问题讨论】:

    标签: ember.js


    【解决方案1】:

    我最终想出了如何解决这个问题。关键是在路由器上添加model方法,它知道如何将一个slug变成一个模型:

    App.StrategyRoute = Ember.Route.extend()
      model: (params, transition) ->
        App.store.getById('strategy', parseInt(params.strategy_slug))
    
      serialize: (model) ->
        {
          strategy_slug: model.get('slug')
        }
    

    【讨论】:

      猜你喜欢
      • 2014-08-12
      • 1970-01-01
      • 2019-08-09
      • 1970-01-01
      • 2014-04-08
      • 1970-01-01
      • 2012-06-26
      • 2012-01-08
      • 2017-01-31
      相关资源
      最近更新 更多