2013-03-26 96 views
3

我正在使用流星路由器編寫一個簡單的流星應用程序。我的問題是路由器知道請求參數,但模板不是。所以我繞了公約,如本:避免使用Session.set

Meteor.Router.add({'/projects/:id', function(id) { 
    Session.set('currentProjectId', id); 
    return 'project'; 
} 

Template.project.project = function() { 
    return Projects.findOne(Session.get('currentProjectId')); 
} 

是否有一個更清潔的方式來獲得在模板級別當前請求ID PARAM,以避免所有這些會話變量?

+0

我相信這是它的設計。 [Session](http://docs.meteor.com/#session)允許模板被反應,所以如果您的URL上的ID發生更改,您的模板將會更新。 – pstuart2 2013-03-26 01:50:24

+1

我同意這是流星的方式。擁抱它:) – adrianj98 2013-03-26 03:24:45

+0

大多數人認爲這是不穩定的,但@ adrianj98說,這是流星的方式。起初我甚至覺得不舒服。但後來我發現它是行得通的! – Prashant 2013-03-26 07:23:20

回答

5

會話對象是一個全局(singletone)註冊表。有很多原因沒有使用它們(只是谷歌爲「爲什麼(單線程,全局對象,註冊表模式)(是|是)不好」

在流星的情況有點特別。非常簡單的方法來反應性地存儲變量,這就是爲什麼你不在應用程序中使用全局變量的唯一原因。假設你不需要反應性 - 你會把它變成一個全局變量嗎?可能不是。重新使用會話從代碼中的一個地方獲取變量的內容到另一個地方(在兩個其他方式中不相關的對象之間是不可見的「神祕橋樑」),這既不是「流星」方式也沒有乾淨的使用(指上面的搜索結果),這只是一個容易的,骯髒的可能性

清潔方法

如何避免這種情況:創建您自己的反應變量。流星提供了所有它的手段,它真的很容易做到:

(function() { 
    var currentProject; 
    var currentProjectDependency = new Deps.Dependency(); 

    Meteor.Router.add({'/projects/:id', function(id) { 
     currentProject = id; 
     currentProjectDependency.changed(); 
     return 'project'; 
    } 

    Template.project.project = function() { 
     Deps.depend(currentProjectDependency); 
     return Projects.findOne(currentProject); 
    } 
}()); 

現在我們不使用會話來存儲信息,但有反應也是如此。此外,我們不污染全球空間。請注意,最新發布的Meteor會自動添加閉包。

這個例子可以擴展到更復雜的用例,其反應性跨越幾個對象(例如控制器)。看看我的navigation package是一個更復雜的例子。

理由使用會話

那麼,爲什麼會話存在呢?兩個原因:

爲了簡單起見。流星努力成爲初學者的友好。由於對反應性和體系結構的理解,我描述的方法有點複雜。大多數項目都足夠小而不關心這一點。

但是更大的項目可以使用會話:跨頁面重新加載存儲信息時,您無法恢復其他項目。在我看來,這是使用會話的唯一理由。會話內容在代碼推送頁面重新加載時「持久」。如果這認爲不好呢?不是,因爲只有一個對象依賴於會話的內容。請注意,這不適用於您的示例,因爲您可以輕鬆恢復信息。

+0

這是一個有用的,寫得很好的答案。謝謝。 +投票 – jdc 2013-06-18 22:38:59