Ember.js:访问父路由的控制器

时间:2014-02-05 11:33:51

标签: javascript ember.js

我的应用中的用户有个人资料页面。用户可以查看自己的个人资料和其他用户的个人资料。在他自己的个人资料中,他能够改变他的化身,但当然他不能改变另一个用户的化身。使用配置文件路由的beforeModel挂钩按需加载头像上传脚本。问题是只有在用户访问自己的个人资料时才加载此脚本,而不是其他用户的个人资料。

这是我的代码:

路由器:

Router.map(function () {

    this.resource('user', { path: '/:user_id' }, function () {
        this.resource('profile');
    });

});

申请路线:

var ApplicationRoute = Em.Route.extend({

    model: function () {
        return {
            currentUser: this.config.currentUser
        };
    }

});

用户路线:

var UserRoute = Em.Route.extend({

    model: function (params) {
        var currentUser = this.modelFor('application').get('currentUser');

        if (currentUser.get('id') === params.user_id) {
            return currentUser;
        } else {
            // getUser returns promise
            return this.data.getUser(params.user_id);
        }
    }

});

用户控制器:

var UserController = Em.ObjectController.extend({

    needs: 'application',

    isCurrent: function () {
        return (this.get('id') === this.get('controllers.application.currentUser.id'));
    }.property('id')

});

个人资料路线:

var uploaderScriptInjected = false;

var ProfileRoute = Em.Route.extend({

    beforeModel: function () {
        if (!uploaderScriptInjected && this.uploaderNeeded()) {
            return $.getScript(this.config.assets.uploader)
                .then(function () {
                    uploaderScriptInjected = true;
                });
        }
    },

    uploaderNeeded: function () {
        // This is not working:

        // return this.controllerFor('user').get('isCurrent');
    },

    model: function () {
        var user = this.modelFor('user');

        return Em.RSVP.hash({
            photos: this.data.photosByUser(user.get('id'))
        });
    }

});

查看个人资料路线的beforeModeluploaderNeeded方法。我想使用用户控制器的isCurrent属性,但用户路由的setupController方法在 uploaderNeeded之后被称为,这意味着用户控制器的实例没有'已生成并且尚未设置其模型。当然我可以使用这段代码:

uploaderNeeded: function () {
    return this.modelFor('application').get('currentUser.id') === this.modelFor('user').get('id');
}

...但它重复用户控制器的isCurrent属性逻辑。

有没有办法从配置文件路由的方法访问用户控制器的属性?

1 个答案:

答案 0 :(得分:0)

尝试扩展父控制器,例如 App.FirstController = Ember.ArrayController.extend({}) 然后 App.SecondController = Ember.FirstController.extend({})