Ember:在路线不工作时设置控制器的属性

时间:2013-09-06 21:28:31

标签: ember.js

我有一个用户模型,用户有很多'录音'。在用户页面上,我希望能够对用户的录音进行分页。我的路由器看起来像这样:

App.Router.map ->
  @.resource 'user', path: '/:user_id', ->
    @.route 'page', path: '/page/:page_id'

我想像这样在UserPageRoute中设置selectedPage属性(为了简单起见,页码是硬编码的):

App.UserPageRoute = Ember.Route.extend
  setupController: ->
    @.controllerFor('recordings').set('selectedPage', 3)

这似乎有效。我可以在调试路由代码时检查属性,并且属性似乎已设置:

@.controllerFor('recordings').get('selectedPage') => 3

如果我直接访问用户页面(/ user / 25 / page / 3)并调试RecordingsController,则不再设置selectedPage。

@.get('selectedPage') => undefined

这是一个说明问题的jsbin http://jsbin.com/owudUgI/20/edit

1 个答案:

答案 0 :(得分:2)

这不能按预期工作的原因有点微妙。

问题是,在selectedPage的单例实例上正确设置RecordingsController时,recordings模板中呈现的实际记录列表将单独包装,新的RecordingsController,其中selectedPage未设置。

为什么会这样?

有两种方法可以在把手模板中调用render助手。如果传递单个参数,则将使用相应的单例控制器作为上下文来呈现命名模板。

如果传递两个参数,则使用相应控制器的新实例呈现命名模板,并将其内容设置为传递的第二个参数。

所以你最终得到了两个RecordingsController个实例:selectedContent设置的单例实例,以及recordings模板的第二个实例。

要解决此问题,您需要更改两件事。首先,将渲染调用更改为

{{render 'recordings'}}

其次,明确定义UserRoute,以便您可以在设置新的RecordingsController时设置单身User的内容:

App.UserRoute = Em.Route.extend
  setupController: (controller, model) ->
    @_super controller, model
    @controllerFor('recordings').set 'content', model.get('recordings')