我已經遇到過這樣的情況。因此,在rails 3中,隨着資產管道的引入,我們更好地將javascript從視圖中分離出來。但是,如果我們想要將某些實例變量從控制器轉發到JavaScript,該怎麼辦?看來唯一的解決方案是在視圖中嵌入JavaScript。有什麼辦法可以解決這個問題嗎?感覺就像,動態組件不可能與視圖分離。這種情況偶爾會發生,當我使用谷歌可視化API。我經常需要將大數據推送到api中。如何在Rails項目中整理Javascript
感謝
我已經遇到過這樣的情況。因此,在rails 3中,隨着資產管道的引入,我們更好地將javascript從視圖中分離出來。但是,如果我們想要將某些實例變量從控制器轉發到JavaScript,該怎麼辦?看來唯一的解決方案是在視圖中嵌入JavaScript。有什麼辦法可以解決這個問題嗎?感覺就像,動態組件不可能與視圖分離。這種情況偶爾會發生,當我使用谷歌可視化API。我經常需要將大數據推送到api中。如何在Rails項目中整理Javascript
感謝
很簡單!
假設我們有以下看法供控制器index.html.erb
#GET /index.html
def index
@some_data = {:foo => [:bar0, :bar1]}
end
我們認爲(index.html.erb),我們將嵌入HTML數據第一
<%= javascript_include_tag "index" %>
<div id="home_page">
<!-- Pass members to javascript -->
<div id="self" data-some_data='<%= @some_data.to_json %>'></div>
</div>
最後,假設我們使用jQuery,我們可以簡單地訪問數據在index.js。
$(document).ready(function() {
some_data = $("#self").data("some_data");
alert(some_data.foo[0]); //Says "bar0"
}
$(document).ready(function() {
//This will fail
some_data = JSON.parse($("#self").data("some_data"));
alert(some_data.foo[0]); //Says "bar0"
}
但是,使用JSON.parse 將無法正常工作。從JSON.parse返回的信息不是必然一個字符串,在這種情況下,它是一個javascript對象; jQuery's data function將嘗試隱式地將字符串轉換爲合理的JavaScript對象。在包含JSON字符串的數據屬性的情況下,data屬性中的字符串將被轉換爲「javascript對象」。
如果你不喜歡的$.data
神奇的行爲,你可以代替$("#self").data("some_data")
您有三個主要選項:
內嵌的JavaScript
像你建議,你可以在它的內容是動態確定的頁面嵌入<script>
標籤。
DOM
它是一種常見的做法有一個隱藏的<textarea>
,其內容是某種類型的數據(通常JSON)的。在頁面加載時,您可以使用DOM訪問元素的值屬性。
單獨的HTTP請求
您可以讓服務器成爲了一個JSON數據,這些數據通過XMLHttpRequest,或其他方式提出要求。
一個乾淨的方式做到這一點是Gon gem。它專門用於「讓您的Rails變量到您的js」
有關其他幾個選項,請參閱此railscasts episode(或閱讀ASCIIcasts transcript)。
我愛寶石。在速度方面使用寶石有什麼缺點嗎? – zsljulius
我經常使用DOM方法使用
JSON.parse($("#self").attr("data-some_data"))
,我覺得從代碼維護的角度來看最整潔。 –