JavaScript Ember.js 中不知道可以不可以实现像 Rails 继承 Controller 的方法?

QueXuQ · 2015年06月08日 · 最后由 JeskTop 回复于 2015年06月09日 · 1459 次阅读

假设如果部分 Controller 中,都是调用一样的 Layout 和需要before_filter :authenticate_user!只需要建一个:

class BaseController < ApplicationController
  layout 'user'
  before_filter : authenticate_user!
end

然后需要使用 Controller,只需要:

class UsersController < BaseController
  def index    
  end
end

但是不知道 Ember 中的 Route 有没有类似上面的写法?我找了一下,目测没有找到,最方便的也就好像只能用 Mixin 了。但是这样不太方便,得跑到每个 Route 中,然后加上:AuthenticatedRouteMixin,甚至我想每个 Route 调用时,都触发一个BeforeModel都不是一件容易的事情,不知道是不是我没有发现特别好的方法呢?

按你的要求来说的话,我觉得继承 Route 比较好吧,可以定义一个比如说 AuthenticatedRoute,然后里面定义一些方法,然后需要验证的 Route 都继承自这个 AuthenticatedRoute,

AuthenticatedRoute.extend({
 ...........

});

也许,我们可以用两种方式去解决这个问题,当然,其实 Ember 是提供类似 Rails 的方式的,JS Bin:http://emberjs.jsbin.com/xudebamena/1/edit?html,js,console,output 方法一:

App.Route = Ember.Route.extend({
  beforeModel: function(transition) {
    console.log('调用extend!');
  }
});

App.ApplicationRoute = App.Route.extend();

方法二:

Ember.Route.reopen({
  beforeModel: function(transition) {
    console.log('调用reopen!');
  }
});

App.CheckRoute = Ember.Route.extend({
  beforeModel: function(transition) {
    this._super(transition);
    console.log('进入Check!');
  }
});

当然,因为方法二改的是 reopen,比较底层,我会更倾向于使用方法一的 extend。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号