1

ルータV1では、次のような単純なgoBack機能を作成できます。

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({
    index: Ember.Route.extend({
        route: '/',
        redirectsTo: 'posts'
    }),
    posts: Ember.Route.extend({
        route: '/posts',
        showPost: Ember.Route.transitionTo('post'),
        connectOutlets: function(router){
           router.get('applicationController').
               connectOutlet('posts',App.Post.find());
        }
    }),
    post: Ember.Route.extend({
        route: '/posts/:post_id',
        goBack: Ember.Route.transitionTo('posts'),
        connectOutlets: function(router, post) {
            router.get('applicationController').connectOutlet('post', post);
        }
    })
  })
});

私はルーターv2で同じことをしようとしていて、次の解決策を思いつきました。

App.ApplicationController = Ember.Controller.extend({
  currentPathDidChange: function () {
    this.set('_previousPath', this.get('_currentPath'));
    this.set('_currentPath', this.get('currentPath'));
  }.observes('currentPath')
});

App.GobackRoute = Ember.Route.extend({
  redirect: function (model) {
    var previousPath = this.controllerFor('application').get('_previousPath');

    var parts = previousPath.split(".");

    var router = this.get('router');
    if (router.hasRoute(parts[parts.length - 1])) {
        this.transitionTo(parts[parts.length - 1]);
    } else if (router.hasRoute(parts[parts.length - 2] + "." + parts[parts.length - 1])) {
        this.transitionTo(parts[parts.length - 2] + "." + parts[parts.length - 1]);
    } else {
        Ember.Logger.warn('No route for: %s', previousPath);
    }
  }
});

これに対するもっと簡単な解決策はありませんか?

jsFiddle

ルートやコントローラーなどを再利用したいのですが、次のようなスパゲッティルーティングは発生しません。

App.AnimalsRoute = Ember.Route.extend({
  events: {
    goBackToThis: function() {
        this.transitionTo('this');
    },
    goBackToThat: function() {
        this.transitionTo('that');
    },
    goBackToSomeThingElse: function() {
        this.transitionTo('someThingElse');
    }
  } 
});

ルーター全体で1つのゴーバック機能が必要です。私の最初の解決策は次のようなものになります:(すべてのgoBackルートとebedルートの再利用を探します)

App.Router.map(function (match) {
    this.route('home', { path: '/' });
    this.route('logout');
    this.route('login');
    this.resource('goBack', { path: '/goback' });

    this.resource('ccpr', function () {
        this.resource('goBack', { path: '/goback' });
        this.resource('ccprPatients',  { path: '/' }, function () {
            this.route('search');
        });
        this.resource('ccprPatient', { path: '/:ccpr_patient_id' }, function () {
            this.resource('goBack', { path: '/goback' });       
            this.resource('ccprPracticeSessions', { path: '/practicesessions' }, function () {
            });
            this.resource('ccprPracticeSession', { path: '/practicesessions/:ccpr_practicesession_id' }, function () {
                this.route('info');
                this.route('anamnese');
                this.route('medication');
                this.route('trainingModel', { path: '/trainingmodel' });
                this.route('socialEvaluation', { path: '/socialevaluation' });
                this.route('medicalFollowUp', { path: '/medicalfollowup' });
                this.route('psychologicalEvaluation', { path: '/psychologicalevaluation' });
                this.route('nutritionalAdvice', { path: '/nutritionaladvice' });

                this.resource('goBack', { path: '/goback' });

                this.resource('ebedMedication', { path: '/ebedmedication/:ebed_medication_id' }, function () {
                });
                this.resource('ebedLabResult', { path: '/ebedlabresult/:ebed_labresult_id' }, function () {
                });
                this.resource('ebedDietContact', { path: '/ebeddietcontact/:ebed_dietcontact_id' }, function () {
                });
                this.resource('ebedNutritionBmi', { path: '/ebednutritionbmi/:ebed_nutritionbmi_pkid' }, function () {
                });
            });
        });
        this.resource('ccprCardioArticles', { path: "/cardioarticles" });
        this.resource('ccprCardiologists', { path: "/cardiologists" });
        this.resource('ccprInfoSession', { path: "/infosession" });
        this.resource('ccprPatientPresence', { path: "/patientpresence" });
        this.resource('ccprPresenceOverview', { path: "/presenceoverview" });
        this.resource('ccprNextNutritionalAdvices', { path: "/nextnutritionaladvices" });
    });
    this.resource('ebed', function () {
        this.resource('goBack', { path: '/goback' });
        this.resource('ebedMedications', { path: '/ebedmedications' }, function () {
        });
        this.resource('ebedMedication', { path: '/ebedmedication/:ebed_medication_id' }, function () {
        });
        this.resource('ebedLabResults', { path: '/ebedlabresults' }, function () {
        }); 
        this.resource('ebedLabResult', { path: '/ebedlabresult/:ebed_labresult_id' }, function () {
        });
        this.resource('ebedDietContacts', { path: '/ebeddietcontacts' }, function () {
        });     
        this.resource('ebedDietContact', { path: '/ebeddietcontact/:ebed_dietcontact_id' }, function () {
        });
        this.resource('ebedNutritionBmis', { path: '/ebednutritionbmis' }, function () {
        });         
        this.resource('ebedNutritionBmi', { path: '/ebednutritionbmi/:ebed_nutritionbmi_pkid' }, function () {
        }); 
    });
});

もっといい方法はありませんか?

4

1 に答える 1

1

更新された JSFiddle の例

eventsアクションを定義するためにルーターのプロパティを使用して、新しいルーターで同じことを行うことができます。ガイドから:

アクションが現在のコントローラーで見つからない場合は、現在のルート ハンドラーにバブル アップします。そこから、アプリケーション ルートに到達するまで、親ルート ハンドラにバブルアップします。

あなたの例では、ルートgoBackの親でアクションを定義する必要があります。animals.doganimals.cat

App.AnimalsRoute = Ember.Route.extend({
    events: {
        goBack: function() {
            this.transitionTo('index');
        }
    } });

{{action}}これは、テンプレートから標準ヘルパーを使用して呼び出すことができます。

<a href='#' {{action goBack}}>Go Back</a>
于 2013-01-29T15:44:25.680 に答える