2010-10-29 44 views
4

嘿大家好,我正在开发一个应用程序,并且我在使用新的Rails 3 link_to时遇到了困难。这是情况 - 我的“主页”页面上有两个div,每个div都使用ajax填充到document.load中。这按预期工作。rails link_to:远离ajax加载的内容

在我加载到这些div的页面内容中,我想使用link_to ...:remote => true功能。该源按照预期与data-remote =“true”标记进行呈现,但是当我点击链接时,它们完全被忽略(该链接被视为常规超链接)。

我已经编写了能正确处理所有事情的.rjs文件(因为它们在硬编码时工作),所以这不是问题。

下面是阿贾克斯加载内容的HTML源:

<div> 
    <a href="/cart/add/2" data-remote="true">Link A</a> 
    <a href="/cart/add/1" data-remote="true">Link B</a> 
</div> 

点击时通常嵌入到网页中的链接之一,导致我的购物车,以正确地更新......然而,当我动态加载这个内容到AJAX页面,链接只是跟着忽略data-remote =“true”...

最初我以为它和原型没有正确加载AJAX的东西有关,但我'我已经检查了所有这一切,并没有改变一件事...

我真的很困惑...有没有人有这个想法?

# add method of controller 
def add 
    product = Product.find_by_id(params[:product_id]) 
    params[:quantity] ||= 1 
    params[:price] ||= product.price 

    unless product.nil? 
    @line = session[:cart].purchase_lines.select {|l| l.product_id == product.id}.first 
    unless @line.nil? 
     @line.quantity = (@line.quantity + params[:quantity].to_i) 
    else # create a new purchase_line in the cart 
     @line = session[:cart].purchase_lines.build({ :product_id => product.id, :price => params[:price], :quantity => params[:quantity].to_i }) 
    end 
    else 
    flash[:error] = "Unable to add the selected product" 
    end 
end 

和我RJS

# add.rjs 
page.if page['product_' << @line.product_id.to_s] do 
    page.replace 'product_' << @line.product_id.to_s, :partial => 'line' 
page.else 
    page.insert_html :bottom, 'cart', :partial => 'line' 
end 

page.replace_html 'sub_total', number_to_currency(session[:cart].sub_total, :unit => '$') 
page.replace_html 'tax', number_to_currency(session[:cart].tax, :unit => '$') 
page.replace_html 'total', number_to_currency(session[:cart].sub_total+session[:cart].tax, :unit => '$') 
page.visual_effect :highlight, 'product_' << @line.product_id.to_s, :duration => 1 

回答

5

我敢肯定,这里的问题是,当你的页面加载的第一次,你使用了Rails UJS JavaScript库(默认为原型,或jQuery等)将监听器绑定到锚点(链接)元素的onclick事件。但是,当您动态更新页面(通过ajax)时,新的定位标记不会收到此绑定,因为UJS库只在第一次加载页面时才执行。如果你正在使用jQuery为您UJS你应该考虑设在jQuery API docs

描述的jQuery.live()事件处理附件从API如下:

说明:将处理程序到 事件适用于与当前选择器 现在和未来 匹配的所有元素。

具体来说,你应该给将要接受AJAX加载内容的ID,让我们说的“购物车链接”的股利,再加入一些javascript类似于下面的页面:

$('#cart-links a').live('click', function() { 
    // make your AJAX calls here 
}); 

我如果这是你正在使用的原型,那么m不知道是否有Prototype等价物。

进一步我已经进入了JavaScript和Rails,我越发觉到很多Rails的JavaScript帮助者实际上使JavaScript开发和AJAX处理更加困难,我倾向于使用原始jQuery。

祝你好运!

0

我同意帕特里克,当DOM加载时你可能会绑定,所以任何新添加的元素都不会被绑定。如果您使用的JavaScript(即Prototype)没有像jQuery的live()这样的功能,您可以将绑定逻辑封装在一个解除绑定然后重新绑定的函数中(您可能希望为该事件命名空间,取消绑定任何其他处理程序,但我不确定Prototype是否支持命名空间事件),然后可以在插入新元素时调用该函数。或者,您可以将绑定与新创建的元素分开,而不是绑定到具有该类名称或标记名称的每个元素。

和Patrick一样,我也更喜欢使用原始的jQuery。通过这种方式,您不必了解rails.js所做的工作,并且可以解决不符合要求的情况。作为一名开发人员,你应该知道你想要你的JavaScript做什么,并做到这一点。如果您更喜欢使用Prototype,那么您仍然应该制作自己的rails.js,但在我看来,jQuery确实更好。

+0

我同意... jQuery更好,但我想尝试RJS/proto,因为我在看railscasts,并且它们看起来很容易 – sethvargo 2010-11-14 00:50:53