【问题标题】:A way to make all index route models = resource route model?一种使所有索引路由模型=资源路由模型的方法?
【发布时间】:2014-03-03 10:22:11
【问题描述】:

更新

好吧,真幸运……这现在是默认行为as of Ember 1.5。耶!

原问题

在我看来确实很直观,但在 Ember 路由器中并非如此。我有一堆resources,其中大部分有一个index 路由,我希望模型与资源路由的模型相同——即使用动态段按约定选择的对象。例如:

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

我将使用嵌套,所以我不能在我的 chargeRule 模板 中做所有事情,因为该模板将只有 {{outlet}}(有点像 @987654322 @)。所以我的index 路由在大多数情况下将是我的只读视图,我将有一个edit 子路由来更新需要的模型。

让我烦恼的是,index 路由(以及任何其他子路由)的默认模型是:NOTHING!多田! Null 我认为,尽管它可能是空字符串或其他东西。所以,我现在必须创建一堆看起来像这样的小Ember.Route 子类:

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

为每个不同的模型类/路线重复令人作呕的事情。真的,然后大约加倍,因为我希望 /index/edit 路由相同,也许更多。就个人而言,我会认为任何子路由的 default 模型(因为无论如何您都可以覆盖它)应该是父路由的模型而不是 nothing,但我d 有兴趣解释为什么不这样做。

但我的问题是,谁能想出一种方法让我在我的应用程序中实现我所描述的默认行为?我可以reopen 吗?所以我没有十几个或更多样板的 5 行路线对象?

编辑

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

【问题讨论】:

    标签: ember.js ember-router


    【解决方案1】:

    更新

    请参阅问题顶部的注释,不再需要...

    根据@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(routeName 属性未在 API 文档中列出?),虽然它很简单,但应该可以广泛使用。

    【讨论】:

      【解决方案2】:

      原因是因为路径不一定必须包含模型。想想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();
      

      【讨论】:

      • 嗯!你让我考虑创建一个更通用的Ember.Route 子类,出于某种原因我以前没有想到过。谢谢,我现在正在考虑使它更加通用...
      • 哦,我明白你为什么说这不是默认设置。加载所有Albums 因为我点击了/new 子路由,充其量确实是非常低效的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 2016-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-11
      • 1970-01-01
      相关资源
      最近更新 更多