0

我的应用程序的路由器看起来像这样(它是 CoffeeScript):

App.Router.map () ->
  @resource 'conversations', { path: '/' } ->
    @resource 'conversation', { path: ':conversation_id' }
    @route 'new'

所以,在我的应用程序中,我有类似/new, /1,/2等的路径。

我想检测从/1to的转换以/2在我的视图中进行一些初始化(基本上,将焦点放在 textarea 字段上)。不幸的是,由于/1/2使用相同的路线,似乎几乎不可能检测到这种转变。

我尝试didInsertElement在视图中使用(如此currentPath所述)或在控制器中观察(如此所述)。/new如果我从to (不同的路线)去,它工作正常,/1但如果我从/1to 去/2

我发现这个要点建议使用,StateManager但它似乎已经过时(我不确定它是否真的是我需要的)。

你建议我怎么做?

编辑

似乎setupController每次都会调用它,所以我决定像这样重载它:

App.ConversationRoute = Ember.Route.extend {

  setupController: (controller, model) ->
    controller.set 'model', model
    # do something here?

}

我希望init调用我认为的方法:

App.ConversationView = Ember.View.extend {

  init: ->
    @$('form textarea').focus()

}

但是我仍然不知道如何使这两个东西一起工作(这是一个问题,因为我读到控制器不应该知道视图)。

谢谢您的帮助!

4

3 回答 3

3

使用didInsertElement视图挂钩和观察者。

App.ConversationView = Ember.View.extend

  didInsertElement: ->
    @focusOnTextarea()

  modelChanged: (->
    @focusOnTextarea()
  ).observes('controller.model')

  focusOnTextarea: ->
    @$('form textarea').focus()

在从/1 到/2 的情况下,路线和视图没有改变。Ember 做了尽可能少的工作。无需重新渲染视图,因此不需要。但这也让我绊倒了,我认为这是一个很大的问题。

此外,如果您init在视图中覆盖,请确保调用@_super().

注意:该model钩子仅在登陆页面以反序列化 URL 时调用,而不是在从另一个页面转换并更改模型实例时调用。

于 2013-08-16T04:42:02.240 回答
1

didInsertElement如果您需要在视图上实例化某些内容,则视图的方法是最好的方法。如果您需要在模板加载时让控制器执行某些操作,可以将调用放在setupController路由的方法中:

App.FirstRoute = Ember.Route.extend({
    setupController: function(controller){
        controller.onload();
    }
});

这是一个带有完整示例的 jsfiddle:http: //jsfiddle.net/jgillick/Q5Kbz/

每次加载该路由时都会调用它。试试jsfile。单击第二个模板,然后使用浏览器的后退按钮。onload 应该再次触发。

此外,有趣的事实是,您可以将该deactivate方法用作卸载,以便在用户离开该路线时对该控制器执行任何您需要的操作:

App.FirstRoute = Ember.Route.extend({
  deactivate: function(){
    this.controller.unload();
  }
});

无关

需要注意的一件事(与您的问题没有直接关系)如果您在方法中的控制器上设置模型,则每次加载该路由时setupController它将覆盖您的控制器属性。content为了防止这种情况,请在分配周围放置一个条件:

setupController: function(controller, model) {
  controller.onload();
  if (model && (!controller.content || Ember.keys(controller.content).length === 0)) {
    controller.set('content', model);
  }
}
于 2013-08-17T01:11:38.873 回答
1

Route#model是你的朋友吗?它将接收params包含来自 URL 的每次路由更改信息的哈希(即使仅更改正在查看的类的实例)在您的情况下,

App.ConversationRoute = Ember.Route.extend {
  model: (params) ->
    App.Conversation.find params.conversation_id
  setupController: (controller, conversation) ->
    // you have the correct Conversation object

指南更多示例。

于 2013-08-16T03:39:31.933 回答