【问题标题】:Avoid code duplication in Ember.Router?避免 Ember.Router 中的代码重复?
【发布时间】:2012-11-16 13:15:39
【问题描述】:

我的 Ember.Router 越来越大,看起来它很快就会维护 30 多个 URL 路由。现在,很多这样的路由都做同样的事情,例如连接一个头插座(可能在所有情况下的 80%)。

有没有一种 Ember.js 方法来避免这些冗余?或者我应该只是将重复的部分移动到一个函数中并调用它?

更新

如您所见,共有三种不同的路径(文章、帖子和用户)。其中两个连接头插座,而第三个不连接。现在想象一下,将有 25 条路由连接头出口,而 5 条不连接。如何避免这些重复?

App.Router = Em.Router.extend({
  root: Em.Route.extend({
    articles: Em.Route.extend({
      route: "/articles",
      connectOutlets: function(router) {
        router.get("applicationController").connectOutlet("header", "header");
        router.get("applicationController").connectOutlet(articles, App.Article.find());
      }
    }),
    posts: Em.Route.extend({
      route: "/posts",
      connectOutlets: function(router) {
        router.get("applicationController").connectOutlet("header", "header");
        router.get("applicationController").connectOutlet("posts", App.Post.find());
      }
    }),
    users: Em.Route.extend({
      route: "/users",
      connectOutlets: function(router) {
        // Don't connect the header here!
        router.get("applicationController").connectOutlet("users", App.User.find());
      }
    })
  })
});

【问题讨论】:

  • 你能在你的问题中添加一个 jsfiddle 或一些代码吗?

标签: ember.js ember-old-router


【解决方案1】:

只是一个想法..我还没有实际测试过,但我认为与此类似的东西是可行的

// some custom route
var CommonRouteOrSomething = Em.Route.extend({
    route: "/",
    connectOutlets: function(router) {
        router.get("applicationController").connectOutlet("header", "header");
    }
})

App.Router = Em.Router.extend({
    root: Em.Route.extend({
        articles: CommonRouteOrSomething.extend({
            route: '/articles', // override route string
            connectOutlets: function(router) {
                // your other outlet will be connected on the super class
                this._super(router); 
                // then your actual outlet
                router.get("applicationController")
                      .connectOutlet(articles, App.Article.find());
            }
        })
        ...
     })
 })

不确定这是否真的有效;就像我说的,这只是一个基于假设的想法

【讨论】:

  • 这看起来很有趣,谢谢。我会看看它,同时看看其他人是否也有这个方法......
  • 我相信你会找到更好的方法,这只是一个随机的想法 :) 不管怎样,让我们​​知道你要解决什么,因为这是我必须要做的事情做得好,直到现在我还没有考虑过:P
  • 好的,我听从了您的建议,由于没有人发布其他方法,我将关闭此帖子...谢谢!
【解决方案2】:

也许另一种方法是使用嵌套路由。这里据我了解,文章连接header 出口,帖子连接帖子outlet。为了去posts路线,我假设你首先必须去文章路线。 (即/文章/帖子) 话虽如此,路由器将如下所示:

App.Router = Em.Router.extend({
  root: Em.Route.extend({
    articles: Em.Route.extend({
      route: "/articles",
      connectOutlets: function(router) {
        router.get("applicationController").connectOutlet("header", "header");
        router.get("applicationController").connectOutlet(articles, App.Article.find());
      }, 

      posts: Em.Route.extend({
        route: "/posts",
        connectOutlets: function(router) {
          router.get("applicationController").connectOutlet("posts", App.Post.find());
        }
      }),
    }),

    users: Em.Route.extend({
      route: "/users",
      connectOutlets: function(router) {
    // Don't connect the header here!
        router.get("applicationController").connectOutlet("users", App.User.find());
      }
    })
  })
});

【讨论】:

  • 如果 OP 实际上是通过文章然后发布,这将是一个更好的方法。我已经这样做了几次,但我不知道,我倾向于将东西扩展到我自己的微库中并从那里开始工作。但如果真的是这样(/articles/posts),那么这可能是最好的方法
  • 是的,你是对的,他可以选择更适合他的。这实际上是应用程序如何根据状态设计的问题。基本上我会说如果帖子与一篇文章相关,那么嵌套路由很好,否则,您的解决方案可能会更好。
  • 我什至不确定那个“解决方案”是否有效,兄弟,这只是一个想法。我认为我有时使用继承方式太多了:P
猜你喜欢
  • 2014-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多