我正在使用引导弹出窗口构建通知功能。当用户单击通知时,它会通过 ajax 调用将该通知标记为已读。在 ajax 成功时,我想用更新的版本替换弹出窗口的内容。这是我到目前为止所拥有的:
$(document).ready(function(){
$("#notificationsBell").popover({
'title' : $('.notifications-title-header').html(),
'html' : true,
'placement' : 'left',
'content' : $(".notifications-list").html()
});
});
$('#notificationsBell').off("click").on("click", function() {
$("#notificationsBell").popover('toggle');
})
$(document).on("click", ".notif-popup-container", function() {
// 1. get correct id for clicked notification
var notifId = $(this).attr("id");
// 2. Update the notification to be read and show update
$.post(
"/notifications/read",
{ notif_id: notifId },
).done(function(data) {
$('#notifUnreadCount').html(data.unread_notifs);
// 3. Replace html content of hidden div with updated notifications
$('.notifications-list').html("<%= j (render partial: 'notifications/partials/test_partial') %>");
// 4. Set popover content to be that div's html
var popover = $('#notificationsBell').data('bs.popover');
popover.config.content = $('.notifications-list').html();
})
# what is originally stored in the popover
<div style="display:none" class="notifications-list">
<%= render 'notifications/partials/popover_notifications' %>
</div>
# _popover_notifications.html.erb
# this is rendered twice, once above and once on ajax success
<% unread_notifications = Notification.unread_count(current_user) %>
<% if unread_notifications.eql? 0 %>
No notifications to display! You are up to date.
<% else %>
<% notifs = current_user.notifications.where(read_at: nil).order("created_at DESC") %>
<% notifs.each do |notif| %>
</div>
<% end %>
<% end %>
此内容通过部分显示。然而,这就是问题出现的地方。虽然我期望ajax成功回调中的部分在ajax成功时渲染,但最近了解到部分的渲染首先由服务器完成(甚至在任何js运行之前),然后是结果被传回 javascript。
因此,两个部分都在页面加载时呈现,这意味着我无法再在 ajax 成功后通过部分渲染动态设置弹出窗口内容。
我的问题是,有没有办法解决这个问题,让我能够动态渲染部分内容,而不是在页面加载时将其填充到 js 中?或者如果没有,可能是一种完全不同的方法——我对任何想法持开放态度。谢谢。
HUH函数
相关分类