1. Gitlab点mark为什么会刷新页面
在Gitlab的讨论区中,用户可以评论他人发表的话题,并可以通过点赞或点mark的方式表达自己的态度。其中点mark是一种很常见的操作,但是很多用户发现点mark之后会导致页面的刷新,让人感到困惑。下面,我们来探讨这个问题。
1.1 点mark的实现原理
首先,我们需要了解一下点mark的实现原理。在Gitlab中,点mark的本质是通过Ajax请求来完成的。具体来说,当用户点击点mark按钮时,会触发一次Ajax请求,将点赞的状态信息提交给服务器。服务器收到请求后,会更新数据库并返回更新后的状态信息给前端页面。
# 点mark路由
post '/projects/:namespace_id/:project_id/snippets/:id/toggle_award_emoji' => 'snippets/award_emoji#create', as: 'toggle_snippet_award_emoji'
现在我们明白了点mark的实现原理,那么为什么会导致页面的刷新呢?
1.2 页面刷新的原因
在GitlabWeb中,当Ajax请求结束后会将其返回的数据填充到特定的div中。如果对于点mark来说,返回的数据涉及到了该话题的点赞数量以及点mark的状态信息。此时,点赞和点mark的图标就需要根据当前的状态进行更新。
然而,由于页面未触发整体刷新,所以Ajax请求返回过来的数据无法直接更新页面中的图标,这就需要通过JS来实现。当图标需要更新时,JS会找到对应的DOM元素并将其更新。而对于某些特殊情况来说,JS可能无法完成更新,导致页面出错。为了避免这种错误发生,需要进行页面的刷新操作。
因此,我们可以得到结论: Gitlab在接受到新的点mark请求返回状态信息后,如果不能通过JS更新点赞和点mark的图标,就会进行页面的刷新操作。
1.3 如何避免页面刷新
如果想通过一些方法避免页面进行刷新操作,我们需要在前端代码中针对点mark的回调函数进行处理。具体来说,我们可以尝试在回调函数中使用JS手动更新对应的图标,避免出现页面的刷新操作。
下面,我们提供一个简单的实现方案:
$.ajax({
type: "POST",
url: "/api/v4/projects/:id/toggle_award_emoji",
data: data,
success: function(data){
var path = "/projects/:id/snippets/:snippet_id/emoji";
var $btn = $('a.award-control');
var $awardEmoji = $('#awarded-emoji');
var apiUrl = gl.buildApiUrl(path).replace(':snippet_id', $btn.data('snippet-id'));
if (data.awarded){
$awardEmoji.html(data.award_emoji);
$('#awarded').show();
}
else {
$('#awarded').hide();
}
$.get(apiUrl, function(_data) {
$btn.attr('data-toggle-state', _data.award_enabled);
});
return true;
}
});
在上述代码中,我们将回调函数设置为了手动更新图标的操作,如果需要进行自定义操作可以在success方法中添加相应的代码。
2. 总结
本文解决了许多用户在使用Gitlab时遇到的点mark导致页面刷新的问题。我们提供了点mark实现原理、页面刷新的原因以及如何避免页面刷新的方案。通过本文的介绍,相信用户们对Gitlab的点mark操作会更加得心应手。