我试图在Drupal 8中刷新我的视图,而不用以下代码重新加载页面:
(function ($, Drupal) {
'use strict';
setInterval(function() {
$('.view-message-activity-stream-timeline-public').trigger('RefreshView');
}, 10000);
})(jQuery, Drupal);
有效。
我的问题:
每次刷新视图时,该页面就会回到视图顶部。
页面刷新还有另一个问题。当我单击主页底部的“ Afficher plus”链接时,第2页显示在第1页的下方,但是刷新页面后它将自动关闭。
答案 0 :(得分:0)
您的问题是由ViewAjaxController
每次在加载/重新加载视图时将ScrollTopCommand
加到ajax响应中引起的。您可以在方法ajaxView
中找到涉及的行:
if (isset($pager_element)) {
$response->addCommand(new ScrollTopCommand(".js-view-dom-id-$dom_id"));
$view->displayHandlers->get($display_id)->setOption('pager_element', $pager_element);
}
希望可以通过实现hook_ajax_render_alter
来更改发送到客户端的命令数据,只需删除viewsScrollTop
命令以使其不再被触发:
function <MODULE>_ajax_render_alter(array &$data) {
$view_name = '<view_name>';
$view_dom_id = '<view_dom_id>';
$selector = '.js-view-dom-id-' . $view_dom_id;
foreach ($data as $key => $value) {
if ($value['command'] === 'viewsScrollTop' && $value['selector'] === $selector) {
unset ($data[$key]);
break;
}
}
}
如果需要将view_dom_id
与view_name
匹配,则可以在$ data数组中搜索settings
命令,例如。 $cmd['settings']['views']['ajaxViews']
具有如下结构,请注意,数组键正是根据views_dom_id构建的:
[ajaxViews] => Array
(
[views_dom_id:<views_dom_id>] => Array
(
[view_name] => <view_name>
[view_display_id] => <view_display_id>
[view_dom_id] => <views_dom_id>
)
)