简体   繁体   中英

execute code only when the “base” route is activated in emberjs

Is there a way to execute when a "base" route is activated/re-activated? I have the following urls:

Router.map(function() {

    // /projects
    this.resource('projects', function() {

        // /projects/2
        this.resource('project', {path: ':id'});
    });
});

I'd like to transitionTo the individual project route if there is only one project returned from the projects route. I can do this:

import Ember from 'ember';

export default Ember.Route.extend({

    model: function() {
        return this.store.findAll('project');
    },

    afterModel: function(projects, transition) {
        if (projects && projects.get('length') === 1) {
            this.transitionTo('project', projects.get('firstObject'));
        }
    }
});

This works nicely...except i can still go to the projects route and since the model has already been loaded that hook doesn't fire again. Is there a way to listen to always enforce that rule when the projects route is activated?

For example, if i go to /projects/23 and then i go to /projects i'd like to auto-transition them to the single project route if there is only one. I don't know how to accomplish that since it's a nested route and the activate and afterModel methods have already been fired when visiting /projects/23 for the first time.

Does that make sense? and how can i accomplish this?

Use an index route on your projects resource. It will only get hit when you hit /projects

ProjectsIndex

export default Ember.Route.extend({

    model: function() {
        var projects = this.modelFor('projects');
        if (projects && projects.get('length') === 1) {
            this.transitionTo('project', projects.get('firstObject'));
        }
    },

});

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM