0

アプリケーションのルーターは次のようになります (CoffeeScript です)。

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

したがって、私のアプリには、、、などのパスがあり/newます。/1/2

/1ビューでいくつかの初期化を行うために からへの遷移を検出したいと/2思います (基本的に、テキストエリア フィールドにフォーカスを置きます)。残念ながら、/1/2は同じルートを使用しているため、その遷移を検出することはほぼ不可能のようです。

didInsertElementビューで使用するか(ここでcurrentPath説明) 、コントローラーで観察してみました(ここで説明)。から/new/1(異なるルート) に行くとうまくいきますが、 から に行くとうまくいきませ/1/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()

}

しかし、これら2つのことを一緒に機能させる方法をまだ理解できません(コントローラーがビューについて知っているはずがないことを読んだので、これは問題です)。

ご協力ありがとうございました!

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

Route#modelあなたの友達はここにいます。ルートが変更されるたびに、URL からの情報を含むハッシュを受け取りparamsます (表示されているクラスのインスタンスを変更する場合でも)。

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 に答える