2013-07-17 21 views
0

我正在開發一個應用程序單頁。我使用Backbone.js和RequireJS。 問題是,在一頁上我使用3個不相關的不同模型。但總是隻加載第一個。如何使用主幹和RequireJS在同一頁面中執行多個模型

page.html中

<html><heade></heade><body> 
<div id="content"> 
    <div id="results"></div> 
    <div id="collectorTable"> 
     <!-- the container that gets populated with the index --> 
    </div> 
    <div id="collectorEdition"> 
     <!-- the container that gets populated with the edition --> 
    </div> 
    <div style="margin-top: 10px"> 
     <div id="terms" style="width: 50%; float: left; height: auto !important; min-height: 100px;"> 
      <div id="termTable"><!-- Term model index --></div> 
      <div id="termEdition"><!-- Term model edition --></div> 
     </div> 
     <div id="termsCampaign" style="width: 50%; float: left; height: auto !important; min-height: 100px;"> 
      <div id="termCampaignTable"><!-- TermCampaign model edition --></div> 
      <div id="termCampaignEdition"><!-- TermCampaign model edition --></div> 
     </div> 
    </div> 
</div> 
<script data-main="js/mainCollector" src="js/libs/require.js"></script> 
<script data-main="js/mainTerm" src="js/libs/require.js"></script> 
<script data-main="js/mainTermCampaign" src="js/libs/require.js"></script> 
</body> 
</html> 

mainCollector.js

require.config({ 
    baseUrl: "js", 
    paths: { 
     html5shiv: "libs/html5shiv", 
     jquery: "http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min", 
     jqueryui: "http://code.jquery.com/ui/1.10.3/jquery-ui", 
     tablesorter: "libs/jquery.tablesorter.min", 
     script: "script", 
     underscore: "libs/underscore.min", 
     backbone: "libs/backbone.min", 
     utils: "utils", 
     //Files Collector 
     CollectorModel: "models/CollectorModel", 
     CollectorCollection: "collections/CollectorCollection", 
     CollectorRouter: "routers/CollectorRouter", 
     // Views 
     edit: "views/Collector/Collector_edit", 
     index: "views/Collector/Collector_index", 
     neww: "views/Collector/Collector_new", 
     row: "views/Collector/Collector_row", 
     show: "views/Collector/Collector_show", 
     //Templates 
     'templates': 'templates' 
    }, 
    shim: { 
     jqueryui: { 
      deps: ["jquery"] 
     }, 
     tablesorter: { 
      deps: ["jquery"], 
      exports: "TableSorter" 
     }, 
     script: { 
      deps: ["jquery", "jqueryui", "tablesorter"], 
      exports: "Script" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     } 
    } 

}); 

require(["backbone", "underscore", "CollectorCollection", "CollectorRouter", "script"], 
    function (Backbone, _, CollectorCollection, CollectorRouter) { 
     var Collectors = new CollectorCollection(); 
     var router = new CollectorRouter({Collectors: Collectors}); 
     Backbone.history.start(); 
    }); 

mainTerm.js

require.config({ 
    baseUrl: "js", 
    paths: { 
     html5shiv: "libs/html5shiv", 
     jquery: "http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min", 
     jqueryui: "http://code.jquery.com/ui/1.10.3/jquery-ui", 
     tablesorter: "libs/jquery.tablesorter.min", 
     script: "script", 
     underscore: "libs/underscore.min", 
     backbone: "libs/backbone.min", 
     utils: "utils", 
     //Files Term 
     termModel: "models/termModel", 
     termCollection: "collections/termCollection", 
     termRouter: "routers/termRouter", 
     // Views 
     ... 
     //Templates 
     'templates': 'templates' 
    }, 
    shim: { 
     ... 
    } 

}); 

require(["backbone", "underscore", "termCollection", "termRouter", "script"], 
    function (Backbone, _, TermCollection, TermRouter) { 
     var terms = new TermCollection(); 
     var router = new TermRouter({terms: terms}); 
     Backbone.history.start(); 
    }); 

mainTermCampaign.js

require.config({ 
    baseUrl: "js", 
    paths: { 
     html5shiv:  "libs/html5shiv", 
     jquery:   "http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min", 
     jqueryui:  "http://code.jquery.com/ui/1.10.3/jquery-ui", 
     tablesorter: "libs/jquery.tablesorter.min", 
     script:  "script", 
     underscore: "libs/underscore.min", 
     backbone: "libs/backbone.min", 
     utils:  "utils", 
     //Files Term Campaign 
     termCampaignModel:  "models/termCampaignModel", 
     termCampaignCollection: "collections/termCampaignCollection", 
     termCampaignRouter:  "routers/termCampaignRouter", 
     // Views 
     ... 
     //Templates 
     'templates': 'templates' 
    }, 
    shim: { 
     ... 
    } 

}); 

require(["backbone", "underscore", "termCampaignCollection", "termCampaignRouter", "script"], 
    function (Backbone, _, TermCampaignCollection, TermCampaignRouter) { 
     var termsCampaign = new TermCampaignCollection(); 
     var router = new TermCampaignRouter({termsCampaign: termsCampaign}); 
     Backbone.history.start(); 
    }); 

回答

0

您應該只有一個main.js文件的視圖,因此

<script data-main="js/mainCollector" src="js/libs/require.js"></script> 
<script data-main="js/mainTerm" src="js/libs/require.js"></script> 
<script data-main="js/mainTermCampaign" src="js/libs/require.js"></script> 

是錯誤的,使用:

<script data-main="js/main" src="js/libs/require.js"></script> 

,並把邏輯成main.js文件。你寫的是mainCollector,mainTerm.js和mainTermCampaign.js是類似的。這意味着你的應用中有三臺路由器,這似乎也是一件壞事,我認爲應該足夠了。我認爲你應該再次考慮如何構建你的代碼。

您將script標籤放入您的body中,這也是不常見的,請閱讀require.js docs並嘗試使用最佳做法。

0

解決
的index.html

<html> 
<heade> 
<script data-main="js/main" src="js/libs/require.js"></script> 
</head> 
<body> 
..... 
</body> 
</html> 

main.js

require.config({ 
    baseUrl: "js", 
    paths: { 
     html5shiv: "libs/html5shiv", 
     jquery: "http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min", 
     jqueryui: "http://code.jquery.com/ui/1.10.3/jquery-ui", 
     tablesorter: "libs/jquery.tablesorter.min", 
     script: "script", 
     underscore: "libs/underscore.min", 
     backbone: "libs/backbone.min", 
     utils: "helpers/utils", 

     //Files Collector 
     CollectorModel: "models/CollectorModel", 
     CollectorCollection: "collections/CollectorCollection", 

     // Files Term 
     TermModel: "models/TermModel", 
     TermCollection: "collections/TermCollection", 
     // Files Term Campaign 
     TermCampaignModel:  "models/TermCampaignModel", 
     TermCampaignCollection: "collections/TermCampaignCollection", 

     // Router 
     Router: "routers/Router", 

     // Views Collector 
     editCollector: "views/Collector/Collector_edit", 
     indexCollector: "views/Collector/Collector_index", 
     newCollector: "views/Collector/Collector_new", 
     rowCollector: "views/Collector/Collector_row", 
     showCollector: "views/Collector/Collector_show", 
     //Views Term 
     editTerm: "views/Term/Term_edit", 
     indexTerm: "views/Term/Term_index", 
     newTerm: "views/Term/Term_new", 
     rowTerm: "views/Term/Term_row", 
     showTerm: "views/Term/Term_show", 
     //Views Term Campaign 
     editTermCampaign: "views/TermCampaign/TermCampaign_edit", 
     indexTermCampaign: "views/TermCampaign/TermCampaign_index", 
     newTermCampaign: "views/TermCampaign/TermCampaign_new", 
     rowTermCampaign: "views/TermCampaign/TermCampaign_row", 
     showTermCampaign: "views/TermCampaign/TermCampaign_show", 

     //Templates 
     'templates': 'templates' 
    }, 
    shim: { 
     jqueryui: { 
      deps: ["jquery"] 
     }, 
     tablesorter: { 
      deps: ["jquery"], 
      exports: "TableSorter" 
     }, 
     script: { 
      deps: ["jquery", "jqueryui", "tablesorter"], 
      exports: "Script" 
     }, 
     underscore: { 
      exports: "_" 
     }, 
     backbone: { 
      deps: ["underscore", "jquery"], 
      exports: "Backbone" 
     } 
    } 

}); 

require(["backbone", "underscore", "CollectorCollection", "TermCollection", "TermCampaignCollection", "Router", "script"], 
    function (Backbone, _, CollectorCollection, TermCollection, TermCampaignCollection, Router) { 
     var Collectors = new CollectorCollection(); 
     var Terms = new TermCollection(); 
     var TermsCampaign = new TermCampaignCollection(); 
     var router = new Router({Collectors: Collectors, Terms: Terms, TermsCampaign: TermsCampaign}); 
     Backbone.history.start(); 
    }); 

router.js

define([ 
     "backbone", 
     "CollectorModel", "editCollector", "indexCollector", "newCollector", "showCollector", 
     "TermModel", "editTerm", "indexTerm", "newTerm", "showTerm", 
     "TermCampaignModel", "editTermCampaign", "indexTermCampaign", "newTermCampaign", "showTermCampaign" 
    ], 
     function(_, 
       CollectorModel,CollectorEditView, CollectorIndexView, CollectorNewView, CollectorShowView, 
       TermModel, TermEditView, TermIndexView, TermNewView, TermShowView, 
       TermCampaignModel, TermCampaignEditView, TermCampaignIndexView, TermCampaignNewView, TermCampaignShowView 
     ){ 
     var Router = Backbone.Router.extend({ 
      routes: { 
       // Collector 
       "Collector/new":  "createCollector", 
       "Collectors/index":  "indexCollector", 
       "Collector/:id/edit": "editCollector", 
       "Collector/:id/view": "showCollector", 
       // Term 
       "Term/new":    "createTerm", 
       "Terms/index":   "indexTerm", 
       "Term/:id/edit":  "editTerm", 
       "Term/:id/view":  "showTerm", 
       // Term Campaign 
       "TermCampaign/new":  "createTermCampaign", 
       "TermsCampaign/index": "indexTermCampaign", 
       "TermCampaign/:id/edit": "editTermCampaign", 
       "TermCampaign/:id/view": "showTermCampaign" 
      }, 
      // functions ... 
    }); 
    return Router; 
}); 
相關問題