2014-11-22 15 views
0

我使用node.js/express和EJS(嵌入式JavaScript)。Node.js Express:重新訪問注入.html文件的變量

我注入一些變量放入一個.html頁面這樣

res.render('userHome.html', { 
       user : user, 
       teams : teams, 
       user_db_name : user_db_name 
      }); 

userHome.html內容:

<html> 
<head> 
    <title>SASC Sparks Lineup Generator</title> 
    <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"</script> 
    <script type="text/javascript" src="/fancy_scripts/userHomeController.js"></script> 

</head> 
<body> 

<form onsubmit="chooseImportTeamOrManualCreate(<%=user._id%>)" id="page1"> 
     <!-- <input id="createNewTeam" type="submit" value="Create New Team"/> --> 
     <button type="submit" value="Create New Team" id="createNewTeamButton">Create New Team</button> 

</form> 
</body> 
</html> 

這裏是chooseImportTeamOrManualCreate.js文件內容

$(document).ready(function() {}); 


function chooseImportTeamOrManualCreate(user_id){ 

     //I want user_id to be passed into this method, but this does not work 

    console.log($.document); 

    if (window.confirm("Do you wish to import team data from an existing roster?")) { 
     window.location.replace("https://stackoverflow.com/users/" + user_id + "/importNewTeamRoster", "Importing new roster"); 
//  window.open("https://stackoverflow.com/users/" + user_id + "/importNewTeamRoster", "Importing new roster"); 
     } 
    else{ 
     window.location.replace("https://stackoverflow.com/users/" + user_id + "/importNewTeamRoster", "Importing new roster"); 
    } 
}; 

*試圖將<%= user._id%>注入到chooseImportTeamOrManual Create()讓我覺得有點傻,因爲我知道這可能是荒謬的錯誤。

我怎麼能得到user_id傳遞給chooseImportTeamOrManualCreate(),然後一旦我在chooseImportTeamOrManualCreate()我如何訪問變量?也許用戶變量附加到文檔/窗口DOM對象?

回答

1

找出某種方式如何被渲染到頁面:

<form onsubmit="chooseImportTeamOrManualCreate(<%=user._id%>)" id="page1">

假設<%=user._id%>是包含「lk45jqlk43jakljf」這是一個特定的用戶數據庫鍵的字符串。

現在認爲

  • 如何字符串通常會得到一個頁面的模板處理渲染?
  • 加引號還是不加引號?

您是不是回答without quotes?希望你做到了。爲什麼這很重要?

好,形式會再調用

chooseImportTeamOrManualCreate(lk45jqlk43jakljf) 

確實看起來好不好?也許?

這將是如果lk45jqlk43jakljf變量名稱。但事實並非如此。這是一個文字值,您要將其分配給正式參數user_id,因此它需要括號內的引號,如 'lk45jqlk43jakljf'。當有提交,你想要這個電話,用引號:

chooseImportTeamOrManualCreate('lk45jqlk43jakljf') 

,因爲這是被已經呈現的行使用雙引號,我們必須在這裏使用單引號,像這樣:

<form onsubmit="chooseImportTeamOrManualCreate('<%=user._id%>')" id="page1">

這樣,無論user._id是什麼,它在呈現到表單中時都會被引用。

有時候,有人會把你需要的代碼粘在你的工作上,而沒有時間分配給它正確的重構。儘管如此,這樣的代碼對於擴展重構項目來說似乎已經成熟了。這裏有兩件事情是「糟糕的代碼味道」:

  1. 設置HTML中的事件處理程序或成爲HTML的模板。相反,使用JS或jQuery。見,例如,these jQuery coding standards, under Events #5這裏筆者寫道:

不要使用HTML標記的行爲(JavaScript的內聯),這些正在調試的噩夢。 >始終使用jQuery綁定事件以保持一致,以便動態地附加和移除事件。

<a id="myLink" href="#" onclick="myEventHandler();">my link</a> <!-- BAD -->

不要使用jQuery?精細。出於同樣的原因,以純Javascript設置事件仍然比設置HTML字符串中元素的某些屬性更好。

下一個工作的人,可能是你,必須做更多的搜索來找到相關的代碼和他們做的事情,觀察多種格式規則等等......當該代碼更多地結合慣例。

  1. 將HTML可變數據嵌入到HTML或模板中成爲HTML。這實際上只是重複與上述相同的問題。
+0

感謝您的支持。你最後幾句話有一點意義,但是一個例子(鏈接?)會非常有幫助。 – 2014-11-22 07:16:20

+0

另外@Paul,是附加到DOM文檔本身的注入變量?這將是一個解決方法,也許這與AJAX解決方案有關。 – 2014-11-22 07:22:23

+1

您的應用程序的任何頁面上的客戶端代碼應該以某種方式知道其「userid」。問題是如何。 localStorage看起來相當不錯,如果你願意支持大多數HTML 5,因爲一旦設置它就在那裏,即使在刷新之後。當然,這並沒有回答如何到達那裏的問題,顯然它需要來自服務器和頁面,而不是匿名請求。所以也許我對AJAX的評論不適合設置用戶標識。 – Paul 2014-11-22 07:31:38