1

我的 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());
      }
    })
  })
});
4

2 回答 2

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());
            }
        })
        ...
     })
 })

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

于 2012-11-16T14:33:10.587 回答
1

也许另一种方法是使用嵌套路由。这里据我了解,文章连接headeroutlet,posts连接posts outlet。为了走posts路线,我假设您首先必须走文章路线。(即/articles/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());
      }
    })
  })
});
于 2012-11-16T18:34:45.287 回答