2010-09-07 43 views
1

我喜歡分離功能的想法,這看起來像未來的方式。有一點我不明白的不顯眼的javascript

但我習慣於將JavaScript內部循環嵌入到像Rails ERB或PHP這樣的嵌入式語言中,我可以在JavaScript中使用特定對象的ID作爲引用。

Rails的例子:

<% @comments.each do |comment| %> 
    <div id="comment_<%= comment.id %>"> 
    <%= comment.text %> 
    <% link_to_function "Reply", "$('comment_#{comment.id}').insert(\"#{escape_javascript(render :partial => "_form", :locals => {:comment => comment})}\", {position: 'bottom'});" %> 
    </div> 
<% end %> 

這不是我已經結束了想要麼使用JavaScript的內部Ruby方法唯一的一次。我可能要使用常數,或致電環user.enabled?user.full_name內的物體上的其他Ruby方法,或與這些對象渲染諧音等

那麼這是怎麼應該完成,如果所有的JavaScript是在另一個文件或循環之外?我知道你可以使用CSS選擇器在javascript中迭代一堆div,但是這不允許我在對象上調用ruby方法。

我錯過了什麼?謝謝!

+0

使用Ruby方法外部JavaScript庫或文件意味着您只能將這些庫或文件用於Ruby應用程序。考慮看jQuery;研究jQuery使用參數化解決這個問題的方式。 – 2010-09-07 19:50:04

+0

我會插入我自己的博客文章的主題:http://whatsthepointy.blogspot.com/2010/07/wallflower-unobtrusive-jquery.html – Pointy 2010-09-07 20:51:36

回答

2

我認爲這shold與「數據ID」參數來完成,如圖此截屏 http://railscasts.com/episodes/229-polling-for-changes

+0

喜歡這個答案。 – jessegavin 2010-09-07 20:15:36

+0

是的這就是我正在尋找的HTML 5數據屬性。謝謝!關於這個策略的一些事情仍然讓我有點不解(它在rails和javascript參數之間增加了另一個步驟,另外一個地方搞亂了)。另外,將整個呈現的部分放置在數據屬性中是否有意義?我想你可以,看起來很奇怪。 – 2010-09-07 20:38:44

0

原諒我使用jQuery,但Web開發真的很爛,沒有它或類似的庫

對於您的第一個投訴(獲得當前評論),javascript this適合我。

onclick="my_function(this);" 

和js文件

my_function = function(target) { 
    // clicked element passed in 
    // now, let's get comment element by class 
    var comment = $(target).parents('.comment'); 
} 

至於第二個抱怨......我從來沒有需要經常,但有時我包括數據塊在HTML中由JavaScript使用。擴展前面的例子:

<div class="comment" comment_id="<%= comment.id %>"></div> 

而且在my_function

var comment_id = comment.attr('comment_id'); 
1

爲特定的例子中,你已經擁有的標記中的編碼,因爲你設置的div元素註釋ID的ID屬性註釋ID。所以你可以掛掉JavaScript。

+0

有道理,我可以得到id。但是我仍然無法從ruby方法裏面生成文本。 – 2010-09-07 20:19:32

0

使您的客戶端腳本以「選項」對象作爲參數。不要使用任何服務器端腳本;把腳本放在它自己的.js文件中。

然後用輸出js的服務器端腳本創建'options'對象。包含你的腳本並調用它的入口點函數,傳入你的'options'對象。

0

你只需要更多的JavaScript知識來查看它的強大功能,特別是jQuery。你比如我會像解決:

<% @comments.each do |comment| %> 
    <div class="comment"> 
    <%= comment.text %> 
    <a href="reply.php?id=<%= comment.id %>" class="reply">Reply</a> 
    </div> 
<% end %> 
<script type="text/javascript"> 
    $('.comment .reply').click(function(e) { 
    e.preventDefault(); 
    var url = $(this).attr('href'); 
    var result = url.match(/\?id=(\d+)([^\d]|$)/); 
    var id = (result && result[1]); 
    if (id) { 
     // do whatever you want to do with the id 
    } 
    }); 
</script> 

優點:

(1)您沒有JavaScript的所有的地方

(2)工作在無javascript環境

+0

這可以讓你在javascript中獲得id,但是你仍然無法調用JavaScript中的對象的Ruby方法來生成文本。 – 2010-09-07 20:22:06