如何在不滚动回顶部的情况下更新我在 Drupal 8 中的视图?

How to update my View in Drupal 8 without scrolling back to the top?

我正在尝试刷新我在 Drupal 8 中的视图,而无需使用以下代码重新加载页面:

(function ($, Drupal) {

  'use strict';

  setInterval(function() {
    $('.view-message-activity-stream-timeline-public').trigger('RefreshView');
  }, 10000);

})(jQuery, Drupal);

有效。

我的问题:

每次刷新视图时,该页面都会回到视图顶部。

页面刷新还有一个问题。当我点击首页底部的"Afficher plus" link时,第2页出现在第1页下方,但刷新后自动关闭

https://www.s1biose.com/

您的问题是由于 ViewAjaxController 在每次 loads/reloads 视图时将 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_idview_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>
            )

    )