2012-11-05 41 views
3

我已經使用Backbone.js和Require.js啓動了一個JavaScript應用程序。該應用程序顯示不同的頂級視圖 - 搜索項目,編輯項目的不同方面,將項目彼此連接。每個視圖都是獨佔顯示的。如何縮短骨幹路由器的長需求列表

的文件路由器模塊看起來是這樣的:

define([ 
    'backbone', 
    'myapp' 
    'views/search', 
    'views/edit1', 
    'views/edit2', 
    'views/connect'], 
function(Backbone, App, SearchView, EditView1, Editview2, ConnectView) { 

    return Backbone.Router.extend({ 
    routes: { 
     "search": "doSearch", 
     "edit1": "doEdit1", 
     // more routes here 
    }, 
    doSearch: function() { 
     App.main.show(new SearchView()); // Marionette.js regions 
    }, 
    doEditView1: function() { 
     App.main.show(new EditView1()); 
    }, 
    // etc. 
    }); 
}); 

在我的代碼有更多的意見。有沒有辦法減少對一個對象的長期需求列表?也許通過另一個架構或一些require.js技巧?

也許我受到了Symfony 2對「路由器」概念的影響嗎?

回答

1

我一直在想這個問題。

一個簡單的解決辦法是定義一個模塊中,這一切你的意見,然後只包括作爲一個依賴:

的意見/ all.js

define([ 
    'views/search', 
    'views/edit1', 
    'views/edit2', 
    'views/connect'], 
function(SearchView, EditView1, EditView2, ConnectView) { 

    return { 
     "EditView1": EditView1, 
     "EditView2": EditView2, 
     "ConnectView": ConnectView 
     "SearchView": SearchView 
    }; 
}); 

然後你路由器模塊,您可以將視圖/全部作爲依賴項分配給變量Views,並將任意視圖調用爲Views.EditView1,Views.EditView2等:

define([ 
    'backbone', 
    'myapp', 
    'views/all'], 
function(Backbone, App, Views) { 
    ... 

    doSearch: function() { 
    App.main.show(new Views.SearchView()); 
    }, 

    ... 
}); 

我從來沒有真的嘗試過這個,但我認爲它會工作。

1

在語法層面上,Require.js也支持'simplified CommonJS wrapping'。顯然,這無法幫助您避免長時間的依賴列表(如@ shioyama的建議所做的那樣),但會最大限度地減少命名函數參數不匹配的依賴項名稱的風險,並有助於保持整潔(er)。