7

再利用可能な (ポリモーフィックのような) コメント ウィジェットを作成しています。親ルートに戻るためのボタンが必要です (たとえば、/blog_posts/1/comments にいる場合、ボタンで /blog_posts/1 に戻ることができます)。

私は現在 を使用してtransitionToRoute('blog_post')いますが、このコードを任意のモデルで汎用的に実行したいため、これは長期的には機能しません (つまり、ルートの名前について何も知らないため、「blog_post」を呼び出すことはできません)。 . url_forRails の のようなもの、または言い方router.get('parent_route')(または)のいずれかを探していると思いcontroller.get('parent_route')ます。

ポインタやアイデアはありますか?ありがとう。

4

4 に答える 4

12

これは 2013 年に ember v0.9.8 などで回答されましたが、フレームワークはそれ以来長い道のりを歩んできました。フレームワークの現在のバージョンでは、はるかに優れたソリューションがあると思います。私はEmberと連絡を取り合っていないので、この回答を実際に更新することはできません!

ソース コードのプライベート関数から着想を得て、ルートの名前を返す次のメソッドをルートに追加します。parentRoute

Ember.Route.reopen({
  getParentRoute: function(){
    var route = this;
    var handlerInfos = route.router.router.currentHandlerInfos;
    var parent, current;

    for (var i=0, l=handlerInfos.length; i<l; i++) {
      current = handlerInfos[i].handler;
      if((current.routeName == route.routeName)||(current.routeName.match(/./) && current.routeName.split('.')[1] == route.routeName )){
        return parent.routeName;
      }
      parent = current;
    }
  }
})

内部ルートを次のように使用します

App.SomeRoute = Ember.Route.extend({
  events: {
    goBack: function(){
      this.transitionTo(this.getParentRoute());
    }
  }
})

ハンドルバー

<script type="text/x-handlebars" data-template-name="some">
  <a href="#" {{action goBack}}>Back</a>
</script>

実際のコードについては、これを開いて CTRL+F を実行してください function parentRoute

于 2013-04-08T07:08:59.733 に答える
3

ファイル内の Ember 2.6 用に更新app/initializers/parent_route.js

import Ember from 'ember';

var alreadyRun = false;

export default {
  name: 'parent-route',
  initialize: function() {
    if (alreadyRun) {
      return;
    } else {
      alreadyRun = true;
    }
    Ember.Route.reopen({
      parentRoute: Ember.computed(function() {
        let handlerInfos, i, info, len, parent, r;
        r = this.router.router;
        if (r.activeTransition) {
          handlerInfos = r.activeTransition.state.handlerInfos;
        } else {
          handlerInfos = r.state.handlerInfos;
        }
        if (!handlerInfos) {
          return;
        }
        parent = this;
        for (i = 0, len = handlerInfos.length; i < len; i++) {
          info = handlerInfos[i];
          if (info.handler === this) {
            break;
          }
          parent = info.handler;
        }
        return parent;
      }),
      parentRouteName: Ember.computed.alias('parentRoute.routeName'),

      parentController: Ember.computed(function() {
        return this.controllerFor(this.get('parentRouteName'));
      }),

      parentModel: Ember.computed(function() {
        return this.modelFor(this.get('parentRouteName'));
      })
    });

  }
};

this.get('parentController')ルートでは、parentcontroller のようなものとモデルのようなものにアクセスできますthis.get('parentModel')

于 2016-06-29T15:35:46.773 に答える
3

Mudasi Ali のリードに基づいて、Ember v1.5 ソースを確認すると、次を使用します。

Coffeescript (JS/ES が必要な場合は、coffeescript.org を使用してトランスパイルします):

Ember.Route.reopen
  parentRoute: Em.computed ->
    r = @router.router
    if r.currentTransition
      handlerInfos = r.currentTransition.state.handlerInfos
    else
       handlerInfos = r.state.handlerInfos

    handlerInfos = this.router.router.state.handlerInfos
    return unless handlerInfos

    parent = @
    for info in handlerInfos
      break if info.handler == @
      parent = info.handler
    parent

  parentRouteName: Em.computed.alias('parentRoute.routeName')

  parentController: ->
    @controllerFor @get('parentRouteName')

  parentModel: ->
    @modelFor @get('parentRouteName')

上記は、すべてのルートと 2 つの便利な関数およびにプロパティparentRouteおよび を提供します。これらは、特にリソースをネストされたルートとして編集する場合に、多くの状況で役立つ可能性がある親コントローラーとモデルをそれぞれ返します。parentRouteNameparentController()parentModel()

次のように、キャンセル/バック処理のためにビュー/コントローラーなどで使用するいくつかのアクションを定義することもできます。

Ember.Route.reopen
  actions:
    goBack: ->
      @transitionTo @get('parentRouteName')

深いルーティング階層があり、中間ルートをスキップしたい場合は、次のように goBack をオーバーライドするだけです。

App.SomeIntermediateRouteToSkipOnBack = Em.Route.extend
  actions:
    goBack: ->
      # skip the immediate parent and use the grandparent route
      @transitionTo @get('parentRoute.parentRouteName)
于 2014-05-09T04:11:04.730 に答える