2012-07-31 46 views
55

我是Javascript新手,剛剛開始擺弄好奇的流星。真正令我驚訝的是,所有的HTML內容似乎都被合併到一個頁面中。如何使用Meteor創建多頁面應用程序?

我懷疑有一種方法來介紹一些處理指向特殊頁面的URL。看來,「待辦事項」的例子是能夠通過某種類型的Router這樣做。這是URL處理的「規範」方式嗎?

假設我可以處理URL,我將如何構建我的HTML代碼以顯示單獨的頁面?在我的情況下,它們可能都有完全獨立的數據集,所以根本不需要共享HTML代碼。

+3

你應該看看這個: 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

+2

嗯,這些頁面詳細說明如何使用'Backbone.Router'。看起來HTML代碼是通過在'{{#if}}'指令中包裝內容來構造的,但是對我來說這似乎有點......奇怪。 – 2012-07-31 13:21:08

+3

全部查看此問題:目前的解決方案是使用'鐵路由器'。 – 2013-12-08 04:26:12

回答

30

喬恩·金的答案曾經是正確的,但as of Meteor 0.5.4

Work has now shifted to Iron Router. Please consider using IR instead of Router on new projects!

因此,目前的「規範」的方式來做到這一點可能是使用IronRouter

+0

當前最好的選擇是調查[Angular](https://www.meteor.com/tutorials/angular/creating-an-app)和[React](https://www.meteor.com/tutorials/react/爲流星創造一個應用程序)。 – sfiore 2015-10-02 15:44:34

+0

@sfiore儘管對Angular和React的支持是一個很酷的新增功能,但它們都是單頁應用程序框架。除非你能夠使用Angular或React路由器(我甚至不確定這是否可能)在流星內部實現服務器端渲染,否則這些對於多頁面應用來說不是可行的解決方案。 – user456584 2015-10-02 16:07:48

29

據我所知,目前沒有現成的方法來做到這一點。

我建議做的是使用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

希望這有助於。

+0

不應該認爲'meteor add backbone'?除此之外,我可能會看看如何組織我的HTML代碼加載if指令... – 2012-07-31 14:16:34

+0

道歉!是的,它應該是'meteor add backbone'。謝謝! – nsmeta 2012-07-31 15:46:02

+0

這正是我目前正在做的。好答案。 – Adgezaza 2012-07-31 21:18:19

7

這是我哈克解決路由: https://gist.github.com/3221138

只要把該頁面的名稱作爲模板名恩導航到/ {name}的

+1

不錯的主意,但不允許導航到隨機「幫手」模板? – 2012-08-01 07:07:05

+0

您可以通過使用包含允許的頁面的數組來阻止該操作,否則將重定向到索引。 – 2012-08-01 08:36:59

+0

'angularjs'現在可以用於那個,對吧? – 2012-12-18 23:41:03

10

,我發現了同樣的問題。當代碼變得更大時,很難保持代碼清潔。

這裏去我的方法解決這個問題:

我分開不同的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... 
}); 

我希望這種模式對其他流星開發者有幫助。

26

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> 
+0

看起來不錯,肯定會考慮的。謝謝 – 2013-02-05 22:31:41

+1

所以[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

+0

我不知道,對不起 - 除此之外,我知道Meteor現在還沒有正式支持Windows。 – 2013-02-06 20:59:11

相關問題