根据 ajax 请求渲染多个刀片视图部分

Posted

技术标签:

【中文标题】根据 ajax 请求渲染多个刀片视图部分【英文标题】:Render multiple blade view sections on ajax request 【发布时间】:2017-08-09 23:12:19 【问题描述】:

当请求是 ajax 时,我正在渲染内容部分并将其插入 DOM。它按预期工作。

但是.. 我找不到方法,如何同时渲染多个部分,例如 contenttitle 等等。

控制器:

public function awesome(Request $request) 
   if($request->ajax())
       return view('awesome')->renderSections()['content'];
   
   return view('awesome');

Ajax 和 pushstate

var load = function (url) 
    $.get(url).done(function (data) 
      $("#content").html(data);
    )
;

$(document).on('click', 'a[data-request="push"]', function (e) 
    e.preventDefault();
    var $this = $(this),
    url = $this.attr("href"),
    title = $this.attr('title');

    history.pushState(
       url: url,
       title: title
    , title, url);

    // document.title = title;

    load(url);
);

layouts.app

<title>@yield('title')</title>
<meta name="description" content="@yield('desc')"/>

<a data-request="push" title="AWESOME" href="<?= url('/'); ?>/awesome">Awesome</a>
<a data-request="push" title="RANDOM" href="<?= url('/'); ?>/random">Random</a>

<div id="content">
  @yield('content')
</div>

刀片:

@extends('layouts.app')

@section('title', 'Awesome')
@section('desc', 'About awesome')

@section('content')
  some text from awesome page
@endsection

问题:

如何同时渲染两个或多个?我应该使用数组还是其他东西?请给出例子或完整的解释。

感谢您的任何回答。

【问题讨论】:

【参考方案1】:

你可以只发送一个标题和内容的json对象,然后使用JS解析数组并提取两个部分。像这样:

控制器

public function awesome(Request $request) 
   if($request->ajax())
       $view = view('awesome')->renderSections();
       return response()->json([
           'content' => $view['content'],
           'title' => $view['title'],
       ]);
   
   return view('awesome');

Ajax 和 pushstate

var load = function (url) 
    $.get(url).done(function (data) 
      $("#content").html(data.content);
      document.title = data.title;
    )
;

$(document).on('click', 'a[data-request="push"]', function (e) 
    e.preventDefault();
    var $this = $(this),
    url = $this.attr("href"),
    title = $this.attr('title');

    history.pushState(
       url: url,
       title: title
    , title, url);

    // document.title = title;

    load(url);
);

【讨论】:

我已经做了同样的事情,但是我没有返回响应,而是编码视图,然后在 ajax 请求中,我使用data = $.parseJSON(data)。但我认为那是一样的。也许 response() 会更多 laravel 的事情。你觉得怎么样? $.parseJson 仅在您返回 json 字符串时才有效。这是通过响应 json 方法完成的。其次,response json 还将内容类型设置为application/json。最后始终确保从控制器返回响应或视图,而不是字符串。这是技术上正确的方法:) 好的,谢谢。在过去的两天里,我为这个撞了头。

以上是关于根据 ajax 请求渲染多个刀片视图部分的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 AJAX 渲染部分内容?拉拉维尔 5.2

在每个 ajax 请求上重建 JSF 视图

使用 ajax 渲染局部视图

如何正确渲染部分视图,并使用 Express/Jade 在 AJAX 中加载 JavaScript 文件?

部分视图与 Json(或两者)

如何从MVC5中的jquery ajax调用中获取部分视图和JSON数据?