Javascript Rails 6:在呈现部分内容后执行JS函数
Rails和Javascript初学者 在一个培训项目中,我使用JQuery使Javascript Rails 6:在呈现部分内容后执行JS函数,javascript,jquery,ruby-on-rails,webpack,webpacker,Javascript,Jquery,Ruby On Rails,Webpack,Webpacker,Rails和Javascript初学者 在一个培训项目中,我使用JQuery使flash消息在几秒钟后消失。访问者会发送AJAX请求将产品添加到他的购物车中,然后出现一个flash部分“Added to cart”,并在几秒钟后自动消失 #application.html.erb #共享/_flash.html.erb #这可以工作,但每次渲染部分时都会注入脚本 #helpers/application_helper.rb def显示_闪存(键、值) def显示_闪存(键、值) div_c
flash
消息在几秒钟后消失。访问者会发送AJAX请求将产品添加到他的购物车中,然后出现一个flash部分“Added to cart”,并在几秒钟后自动消失
#application.html.erb
#共享/_flash.html.erb
#这可以工作,但每次渲染部分时都会注入脚本
#helpers/application_helper.rb
def显示_闪存(键、值)
def显示_闪存(键、值)
div_class=[flash_class(键),'text center fade show alert dismissible'。加入(“”)
内容标签(:div,class:div\u class)do
内容标签(:p,值)+
按钮标签(类别:“ml自动关闭”,“数据解除”:“警报”,类型:“按钮”)do
content_标记(:span,×;'.html_safe,'aria hidden':'true')+
内容标签(:span'Close',class'sronly')
结束
结束
结束
结束
//app/javascript/packs/custom/flash.js
函数closeFlash(){
设lastAlert=$(“#flash.alert:last”)
函数fadeFlash(){
动画({opacity:0},2000,function()){
$(this.hide('slow',function()){
$(this.remove())
});
});
};
设置超时(fadeFlash,2000)
};
closeFlash();
问题是它用不必要的
标记污染了我的DOM:
这是可以修复的,但是在呈现(AJAX)部分内容之后,有没有合适的方法来执行一个特定的javascript函数?
在我的例子中,每次渲染一个部分时,执行packs/custom/flash.js中的closeFlash()
谢谢你的帮助和时间
编辑解决方案:
来自Amit Patel的回答和
它没有注入整个函数,而是(我相信)调用它所需的最少javascript代码。将
移动到布局或应用程序.js`中,这样它就可以在整个应用程序中使用
像这样修改模板
application.html.erb
$(函数(){
closeFlash();
});
谢谢你的回答,阿米特,我会接受你的解决方案,因为它看起来很清楚。我相信它应该可以工作,但不知何故,我遇到了一个错误jQuery。延迟异常:closeFlash未定义
。修复它会教我更多关于webpacker的知识,我想!再次感谢:)为了让它工作,我必须将
放在我的部分中,并像这样声明closeFlash
函数:window.closeFlash=function(){..}
。它仍然注入了
标记的内容,但是它更干净。Flash消息来自不同的来源(AJAX请求与否),我需要一种通用的方法来处理这些消息。不过,我不确定我是否清楚地理解了你的观点。我正在发布额外的代码我相信您感兴趣的是create.js.erb
,它。将flash部分渲染附加到相关
和生成HTML的显示flash
帮助器。消息内容存储在flash值中,而键用于设置正确的CSS类。
# app/views/shared/_flash.html.erb
<% flash.each do |key, value| %>
<%= display_flash(key, value) %>
<script>
$(function() {
closeFlash();
});
</script>
<% end %>
<div id='flash' class='flex-column'>
<%= render partial: 'shared/flash' %>
<script>
$(function(){
closeFlash();
});
</script>
</div>