2012-09-02 85 views
0

我已經遇到過這樣的情況。因此,在rails 3中,隨着資產管道的引入,我們更好地將javascript從視圖中分離出來。但是,如果我們想要將某些實例變量從控制器轉發到JavaScript,該怎麼辦?看來唯一的解決方案是在視圖中嵌入JavaScript。有什麼辦法可以解決這個問題嗎?感覺就像,動態組件不可能與視圖分離。這種情況偶爾會發生,當我使用谷歌可視化API。我經常需要將大數據推送到api中。如何在Rails項目中整理Javascript

感謝

回答

1

很簡單!

假設我們有以下看法供控制器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" 
} 




注:你會期望不得不使用JSON.parse,因爲它具有像使用對象那樣使用返回數據的奇妙能力,而不僅僅是一個普通的字符串e。G:

$(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")

2

您有三個主要選項:

  1. 內嵌的JavaScript

    像你建議,你可以在它的內容是動態確定的頁面嵌入<script>標籤。

  2. DOM

    它是一種常見的做法有一個隱藏的<textarea>,其內容是某種類型的數據(通常JSON)的。在頁面加載時,您可以使用DOM訪問元素的值屬性。

  3. 單獨的HTTP請求

    您可以讓服務器成爲了一個JSON數據,這些數據通過XMLHttpRequest,或其他方式提出要求。

+0

我經常使用DOM方法使用JSON.parse($("#self").attr("data-some_data")),我覺得從代碼維護的角度來看最整潔。 –