1

私のEmber.Routerはどんどん大きくなり、まもなく30を超えるURLルートを維持するようです。現在、これらのルートの多くは同じことを行っています。たとえば、ヘッダーアウトレットを接続しています(すべての場合の80%)。

これらの冗長性を回避するためのEmber.js-wayはありますか?または、重複した部分を関数に移動して呼び出す必要がありますか?

アップデート

ご覧のとおり、3つの異なるルート(記事、投稿、ユーザー)があります。それらのうちの2つはヘッダー出口を接続しますが、3つ目は接続しません。ここで、ヘッダー出口を接続する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

おそらく他のアプローチは、ネストされたルートを使用することかもしれません。ここで私が理解している限り、記事はheaderアウトレットを接続し、投稿は投稿を接続し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 に答える
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 に答える