2012-07-25 64 views
2

我App.Router變成代碼如何將App.Router分成幾個獨立的塊?

App.Router = Em.Router.extend({ 

    // 100500 pages of horrible COPY-PASTE 

    gotoBlabla: Ember.Route.transitionTo('blabla'), 
    blabla: Em.Route.extend({ 
     route '/blabla', 
     connectOutlets: function (router, context) { 
      router.get('applicationController').connectOutlet('blabla'); 
    ... 
    }) 
    ... 
    ... 

一個巨大的難以管理的單塊是否有申報更簡潔的風格,沒有複製粘貼路由的方法嗎? 如何將路由器聲明拆分爲更小的獨立部分?

+2

看看http://stackoverflow.com/a/11637906/65542 – pangratz 2012-07-25 06:29:09

+0

對於分裂,正確的,這不是一個問題。但是對於冗長和複製粘貼,通過走路通過我們的路由器,我並沒有設計出這種模式,因爲在每個路由中都完成了特定的工作。但是對於簡單的路線,可能會有一種傳統的方式來處理您的情況,根據名稱可以創建路線並連接適當的出口等等。不知道這是一個好主意...... – 2012-07-25 07:28:16

+1

看看在這裏簡報的插件架構也看看http://stackoverflow.com/questions/11391333/emberjs-develop-a-component-in-isolation-with-its-own-routing -states-which-can – sabithpocker 2012-07-25 08:39:26

回答

3

是的,絕對有。在我們的應用程序中,我們使每個頂層路線(術語鬆散地使用)都是在其自己的文件中的一個單獨的類。我們有一個名爲「州」的目錄,這些文件位於這裏。我發現這使得它更易讀,更易於測試。

例如:

// file: states/blog_posts.js 

App.BlogPostsState = Ember.Route.extend({ 
    route: '/posts', 
    /* .... */ 
}); 
// file: states/search_results.js 

App.SearchResultsState = Ember.Route.extend({ 
    route: '/search', 
    /* .... */ 
}); 
// file: states/router.js 

App.Router = Em.Router.extend({ 
    blogPosts: App.BlogPostsState.extend(), 
    searchResults: App.SearchResultsState.extend(), 
    /* .... */ 
}); 

我什麼代碼正在被複制粘貼一遍又一遍不清楚。通常,如果我發現這種情況,我會嘗試將該代碼隔離到一個mixin中,但這並非易事,尤其是在路由器/狀態圖中。

有一件事可能是相關的,我不知道你是否意識到,但事件會遍歷狀態hiercharchy,所以每個葉狀態不一定需要重新實現相同的事件處理。

在此示例中,名爲「showAlpha」的「動作」或「事件處理程序」在所有三種狀態/路徑位置(alpha,beta,delta)中都有效。這消除了多次重新實現同一事物的需要。

App.Router = Ember.Router.extend({ 
    showAlpha: Ember.State.transitionTo('alpha'), 

    alpha: Em.Route.extend({ 
     route: '/alpha' 
    }), 
    beta: EM.Route.extend({ 
     route: '/beta' 
    }), 
    delta: Ember.Route.extend({ 
     route: '/delta' 
    }) 
}); 

我希望有幫助。我不確定這是否覆蓋了您一遍又一遍地複製粘貼的代碼。

+1

據我所知,做簡單的鏈接以達到「beta」或「delta」狀態,我們需要編寫一個名爲showBeta:Ember.State.transitionTo('beta')' 'showDelta:Ember。 State.transitionTo('delta')' 我認爲這有點複製粘貼。 – coxx 2012-07-25 21:23:11