我是Javascript新手,剛剛開始擺弄好奇的流星。真正令我驚訝的是,所有的HTML內容似乎都被合併到一個頁面中。如何使用Meteor創建多頁面應用程序?
我懷疑有一種方法來介紹一些處理指向特殊頁面的URL。看來,「待辦事項」的例子是能夠通過某種類型的Router
這樣做。這是URL處理的「規範」方式嗎?
假設我可以處理URL,我將如何構建我的HTML代碼以顯示單獨的頁面?在我的情況下,它們可能都有完全獨立的數據集,所以根本不需要共享HTML代碼。
我是Javascript新手,剛剛開始擺弄好奇的流星。真正令我驚訝的是,所有的HTML內容似乎都被合併到一個頁面中。如何使用Meteor創建多頁面應用程序?
我懷疑有一種方法來介紹一些處理指向特殊頁面的URL。看來,「待辦事項」的例子是能夠通過某種類型的Router
這樣做。這是URL處理的「規範」方式嗎?
假設我可以處理URL,我將如何構建我的HTML代碼以顯示單獨的頁面?在我的情況下,它們可能都有完全獨立的數據集,所以根本不需要共享HTML代碼。
喬恩·金的答案曾經是正確的,但as of Meteor 0.5.4:
Work has now shifted to Iron Router. Please consider using IR instead of Router on new projects!
因此,目前的「規範」的方式來做到這一點可能是使用IronRouter。
當前最好的選擇是調查[Angular](https://www.meteor.com/tutorials/angular/creating-an-app)和[React](https://www.meteor.com/tutorials/react/爲流星創造一個應用程序)。 – sfiore 2015-10-02 15:44:34
@sfiore儘管對Angular和React的支持是一個很酷的新增功能,但它們都是單頁應用程序框架。除非你能夠使用Angular或React路由器(我甚至不確定這是否可能)在流星內部實現服務器端渲染,否則這些對於多頁面應用來說不是可行的解決方案。 – user456584 2015-10-02 16:07:48
據我所知,目前沒有現成的方法來做到這一點。
我建議做的是使用Backbone.js智能包。 Backbone.js帶有推送狀態路由器,如果用戶的瀏覽器不支持它將回退到哈希URL。
在你的流星應用程序目錄中輸入這個meteor add backbone
。
然後在某處您的客戶端代碼中創建一個Backbone.js的路由器,像這樣:在你的車把模板
var Router = Backbone.Router.extend({
routes: {
"": "main", //this will be http://your_domain/
"help": "help" // http://your_domain/help
},
main: function() {
// Your homepage code
// for example: Session.set('currentPage', 'homePage');
},
help: function() {
// Help page
}
});
var app = new Router;
Meteor.startup(function() {
Backbone.history.start({pushState: true});
});
然後某處,你可以創建一個幫助,將根據設定的值呈現頁面在Session的「currentPage」中。
您可以找到有關Backbone.js的路由器這裏的更多信息:http://backbonejs.org/#Router
還就如何創建Metoer這裏的手把helper方法的相關信息:http://docs.meteor.com/#templates
希望這有助於。
這是我哈克解決路由: https://gist.github.com/3221138
只要把該頁面的名稱作爲模板名恩導航到/ {name}的
不錯的主意,但不允許導航到隨機「幫手」模板? – 2012-08-01 07:07:05
您可以通過使用包含允許的頁面的數組來阻止該操作,否則將重定向到索引。 – 2012-08-01 08:36:59
'angularjs'現在可以用於那個,對吧? – 2012-12-18 23:41:03
,我發現了同樣的問題。當代碼變得更大時,很難保持代碼清潔。
這裏去我的方法解決這個問題:
我分開不同的HTML頁面,因爲我將與其他Web框架做。有一個index.html
我存儲根html頁面。然後爲每個大功能部分創建一個不同的模板並將其放在一個不同的html中。流星然後將它們合併。最後,我創建一個名爲operation
的會話變量,其中我定義了每次要顯示的內容。
這裏不用然後在濺一個簡單的例子
的index.html
<head>
<title>My app name</title>
</head>
<body>
{{> splash}}
{{> user}}
{{> debates}}
</body>
。HTML
<template name="splash">
{{#if showSplash}}
... your splash html code goes here...
{{/if}}
</template>
然後在user.html
<template name="user">
{{#if showUser}}
... your user html code goes here...
{{/if}}
</template>
等等...
在JavaScript代碼,然後我檢查時,使用Session變量來打印每個模板,像這樣:
Template.splash.showSplash = function(){
return Session.get("operation") == 'showSplash';
}
最後主幹路由器管理這個會話變量
var DebateRouter = Backbone.Router.extend({
routes: {
"": "showSplash",
"user/:userId": "showUser",
"showDebates": "showDebates",
// ...
},
splash: function() {
Session.set('operation', 'showSplash');
this.navigate('/');
},
user: function (userId) {
Session.set('operation', 'showUser');
this.navigate('user/'+userId);
},
// etc...
});
我希望這種模式對其他流星開發者有幫助。
Meteor-Router使這很容易。我一直在用望遠鏡構建的一些應用程序中使用它作爲很好的參考。看看望遠鏡的router.js
使用它...
mrt add router
在客戶機/ router.js:
Meteor.Router.add({
'/news': 'news', // renders template 'news'
'/about': function() {
if (Session.get('aboutUs')) {
return 'aboutUs'; //renders template 'aboutUs'
} else {
return 'aboutThem'; //renders template 'aboutThem'
}
},
'*': 'not_found'
});
在模板...
<body>{{renderPage}}</body>
看起來不錯,肯定會考慮的。謝謝 – 2013-02-05 22:31:41
所以[Meteor-Router](https://github.com/tmeasday/meteor-router)依賴於[page-js](https://atmosphere.meteor.com/package/page-js),它依賴於在[page.js]上(https:// github。com/visionmedia/page.js)節點包?安裝完所有東西后,我仍然得到錯誤:'錯誤:ENOENT,沒有這樣的文件或目錄'C:\ Program Files(x86)\ Meteor \ packages \ page-js \ page-js \ index.js''。哪裏出了問題? – 2013-02-06 16:00:33
我不知道,對不起 - 除此之外,我知道Meteor現在還沒有正式支持Windows。 – 2013-02-06 20:59:11
你應該看看這個: http://stackoverflow.com/questions/11461097/meteorjs-routing-with-backbone-js http://stackoverflow.com/questions/ 11501312/default-error-page/11513336#11513336 – fraherm 2012-07-31 12:54:13
嗯,這些頁面詳細說明如何使用'Backbone.Router'。看起來HTML代碼是通過在'{{#if}}'指令中包裝內容來構造的,但是對我來說這似乎有點......奇怪。 – 2012-07-31 13:21:08
全部查看此問題:目前的解決方案是使用'鐵路由器'。 – 2013-12-08 04:26:12