2012-10-11 56 views
0

我最初爲基本函數創建了一個show route,以從mongodb數據庫(使用mongoose)獲取特定的映射,然後將映射呈現給客戶端一個.ejs模板。根據數組迭代的結果在res.render中提供不同的內容

然後,我想創建功能來收藏地圖並添加到用戶的收藏夾(用戶有自己的模型)。作爲其中的一部分,在下面的演示路線中,我想確保如果用戶已經在他們的收藏夾中有地圖,則在客戶端將呈現不同的內容以反映地圖已經是最喜歡的,而不是繼續顯示選擇收藏某條特定路線的選項。

我一直在嘗試使用的方法顯示在下面的代碼中。這決定了是否存在具有收藏夾的authed用戶(使用passport-local及其req.user功能),然後設計爲遍歷收藏夾並呈現不同的變量(如果用戶已經在收藏夾中有地圖)。

我想問題主要是因爲if/else路由將被調用的數組中的所有項目導致多個res.render調用衝突,這顯然不是我的意圖(它工作正常例如,數組中只有一個項目)。但是,我試圖修改代碼以提供其他路由,但是這仍然存在如何處理fall-through問題,以便在存在authed用戶但其最愛不存在的情況下呈現單獨的內容。

我也試圖迭代ejs模板本身的偏好,使用部分通過ejs-本地人,但這似乎並沒有工作(我懷疑與上述類似的原因)。

所以我想知道的是數組迭代方法是否合適或可行,以及更廣泛的問題是否有更好的方法來顯示不同的內容在相同的路由依賴於某些服務器端變量。

客戶端代碼

<div class="row"> 

<% if (favourite == "No") { %> 
    <div class="twelvecol" id="result"><div class="textbox" id="favourite">Favourite this route</div></div> 

<% } else { %> 
    <div class="twelvecol" id="result"><div class="textbox">This route is in your favourites</div></div> 

服務器端代碼

// Locates map on basis of ID in url before returning map, stringifying and sending to server 

exports.show = function(req, res) { 
var mapid = req.query.id; 
console.log(mapid); 
Map.findOne({_id: req.query.id}, function(err, map) { 

     var jmap = JSON.stringify(map); 
       if (req.user && req.user.favourites.length) { 
        favarray = req.user.favourites; 
        console.log(favarray); 
        for (var i = 0; i < favarray.length; i++) { 
         var favs = favarray[i]; 
         if (favs == mapid) { 
          console.log('Favourite'); 
          res.render('show', {obj: jmap, user: req.user, favourite: "Yes"}) 
         } 
         else (favs !== mapid) { 
          console.log("Authed user but non-favourite") 
          res.render('show', {obj: jmap, user: req.user, favourite: "No"}) 
         } 
         } 
        } 
      else { 
        console.log("Either non-authed user or no existing favourites") 
        res.render('show', {obj: jmap, user: req.user, favourite: "No"}); 
        } 
    }) 
}; 

回答

1

在經典的服務器端MVC意義上,它是絕對好讓行動甚至視圖處理模板引擎會調整響應的動態部分。

只要你的用戶對象沒有暴露給視圖(作爲ejs本地),你應該按照你開始的方式得到你想要的東西 - 做一些重要的修改:1.不要在循環中渲染。 (爲什麼?!這實際上必須導致多個呈現調用!)2.使用對動作塊可見的變量。 3.跳過else語句後的條件! (這有效?!我很好奇這是如何通過解析器進行評估的。通常,您可以使用else if (condition)或使用開關來做到這一點 - 但在您的a/b情況下不需要這樣做!)。

提出了一個更乾淨的代碼步驟(只有req。用戶的情況下):

var fav = false; 

for (var i = 0; i < favarray.length; i++) { 
    if (favarray[ i ] == mapid) { 
    fav = true; 
    break; 
    } 
} 

res.render('show', {obj: jmap, user: req.user, favourite: fav}) 

作爲一個附加的建議:使用布爾而不是字符串布爾變量,如favourite和處理它們在你的EJS模板如下圖所示:

<% if (favourite) { %> 
    ... 
<% } else { %> 
    ... 

而且你應該如果用戶存在並且用戶擁有最喜歡的項目,則調整您的第一個if條件檢查:如果要分別處理這兩個條件,則不應將它們合併到一個條件語句中。

+0

這是一個很好的答案 - 感謝您花時間。 – Michael

相關問題