一种使所有索引路径模型成为资源路径模型的方法?

时间:2014-03-03 10:22:12

标签: ember.js ember-router

更新

好的,运气好......现在这是默认行为as of Ember 1.5。耶!

原始问题

对我来说真的很直观,但在Ember路由器中并非如此。我有一堆resource,其中大部分都有index路由,我希望模型与资源路径的模型相同 - 也就是说,按惯例选择的对象动态细分。 E.g:

this.resource("chargeRule", { path: "/chargeRule/:chargeRule_id" }, function(){});

我将使用嵌套,因此我无法在chargeRule 模板中执行所有操作,因为该模板只有{{outlet}}(有点像this guy)。因此,在大多数情况下,我的index路径将成为我的只读视图,并且我将有一个edit子路径来更新需要的模型。

我的错误是,index路线(以及任何其他子路线)的默认模型是:没有!田田! Null我认为,虽然它可能是空字符串或其他东西。所以,我现在必须创建一堆看起来像这样的小Ember.Route子类:

App.ChargeRuleIndexRoute = Ember.Route.extend({
    model: function() {
        return this.modelFor('chargeRule');
    }
});

为每个不同的模型类/路线重复ad-nauseum。真的,然后加倍它,因为我希望/index/edit路线相同,可能更多。我个人认为,对于任何子路由,默认模型(因为你可以覆盖它)应该是父路由的模型,而不是 nothing ,但是我d有兴趣解释为什么不是。

但我的问题是,是否有人能想出一种方法让我在我的应用中描述默认行为?我能reopen的东西?所以我没有十几个或更多的样板5行路由对象?

修改

我可能应该提一下,我知道我的抱怨可能看似微不足道,但我必须创建这么多路由子类这一事实也意味着我应该为每个类创建单独的文件......对吗?那么未来的开发人员可以轻松找到定义给定类的位置?我知道这不是绝对的,但我认为这是一个很好的做法,并且需要我制作尽可能多的微小JS文件...这就是我开始考虑改变默认行为的原因。我会对此发表评论。

2 个答案:

答案 0 :(得分:2)

更新

请参阅问题顶部的注释,这不再是必要的......

根据@ kingpin2k的回答,我提出了这个更普遍的可能性:

App.ParentModelRoute = Ember.Route.extend({
    model: function() {
        return this.modelFor(this.get('routeName').replace(/\..*$/, ''));
    }
});

App.ChargeRuleIndexRoute = App.ParentModelRoute.extend();
App.ChargeRuleEditRoute = App.ParentModelRoute.extend();
App.OtherIndexRoute = App.ParentModelRoute.extend();
.
.
.

这确实减少了代码量...但仍然需要我为每个子路由显式声明一个路由类。它也可能有点hacky(API文档中没有列出routeName属性?),虽然它很简单但它应该可以广泛使用。

答案 1 :(得分:1)

原因是路线不一定要包含模型。想想Albums/New路线的情况。它实际上不会将专辑资源作为其模型。由于这个原因,模型的模型应该没有固定的规则。

话虽这么说,如果你觉得懒洋洋地为你的路线建立某种默认路线并扩展它,这是完全可能的,并且可以通过几种不同的方式完成。

App.DefaultChargeRuleRoute = Ember.Route.extend({
    model: function() {
        return this.modelFor('chargeRule');
    }
});

App.ChargeRuleIndexRoute = App.DefaultChargeRuleRoute.extend();

App.ChargeRuleEditRoute = App.DefaultChargeRuleRoute.extend();

或者如果你想制作一些通用的模型提取路径

App.ModelFetcherRoute = Ember.Mixin.create({
  model: function(){
    return this.modelFor(this.get('modelToFetch'));
  }
});


App.ChargeRuleIndexRoute = Ember.Route.extend(App.ModelFetcherRoute, {
  modelToFetch: 'chargeRule'
});

如果你想让它更小

,这可能会遵循与第一个例子相同的模式
App.DefaultChargeRuleRoute = Ember.Route.extend(App.ModelFetcherRoute, {
  modelToFetch: 'chargeRule'
});

App.ChargeRuleIndexRoute = App.DefaultChargeRuleRoute.extend();

App.ChargeRuleEditRoute = App.DefaultChargeRuleRoute.extend();
相关问题