【问题标题】:Returning javascript view in Laravel在 Laravel 中返​​回 javascript 视图
【发布时间】:2017-03-29 21:15:10
【问题描述】:

在 Ruby on Rails 中,在我的控制器中,我可以执行以下操作:

def jstest
    respond_to do |format|
        format.js
    end
end

这将从相关视图目录返回 jstest.js.erb

jstest.js.erb

alert("Hello World")

结果是我收到了 hello world 警报。

我想在 Laravel 中做同样的事情

在我的控制器中,我有:

public function jstest(  )
{
    return view('jstest');
}

在我看来(我已经尝试过 jstest.blade.js 和 jstest.js)

但我收到错误消息,无法找到视图。

我让它工作的唯一方法是调用视图 jstest.blade.php 并将我的 js 包含在这个 php 文件中的 <script> 标记中。但这感觉有点不对劲……?

这在 Laravel 中是否可行?如果是这样,我哪里出错了?


示例用例:

想象一下下面的例子,我有一个 cmets 表,用户可以点击一个删除按钮,该按钮将发送一个 ajax 请求来删除评论。

我的路线:

Route::delete('post/comments/{comment}','commentsController@delete');

在我的控制器中:

Public Function delete($comment)
{
    $comment->delete();

    return commentDeleted.js
}

commentDeleted.js:

$(#comment).remove();

所以从用户的角度来看,他们点击删除,评论从屏幕上消失,而不加载新页面。

【问题讨论】:

  • 基本上,您所追求的是将一些 .js 粘贴到 HTML 中并允许您使用它的功能,而无需在 .js 文件周围指定 HTML。那么真正的问题在哪里呢?创建一个jsview() 函数,该函数将在一些.blade.php 中包含相关的JS 文件。还有,怎么会觉得不对劲呢?这很简单,你拥有一切随心所欲。 view() 从相关目录返回一个.blade.php 文件。根据需要扩展此系统。
  • 也许它只是来自 Rails,但是返回一个带有 HTML 脚本标签的 php 文件似乎比我真正想要的只是返回 Javascript 需要更多的努力。为什么我不能只说return view('jstest.js');
  • 因为view() 获取并执行.blade.php 视图,这是一些与HTML 混合的PHP。 view('test') 返回resources/views/test.blade.php。正如我所提到的,您可以创建自己的函数来执行您想要的操作。我会发布一个关于这个的答案。
  • 谢谢,非常感谢。你说的很有道理,我只是认为可能有更明确的方式来做到这一点。
  • @Brad 正如您所提到的,您正在使用 ajax 进行删除,对吗?那为什么你在js成功后不删除你的评论。只需从控制器返回 true 或 false 。

标签: php laravel laravel-5


【解决方案1】:

我不知道 Laravel 是否支持这个开箱即用,但这是我对你的问题的看法。

这就是我理解您的问题的方式:您希望指定 .js 文件的路径作为函数的参数,并且您希望通过浏览器加载此 .js 文件时立即执行。

我会在这两个步骤中做到这一点

  1. 创建一个接受路径的jsview()函数,类似于view()
  2. 创建上面将使用的基本.blade.php 文件

.blade.php 内容

假设这个视图将被命名为javascript.blade.php 并且它在resources/views/ 目录中。

<!DOCTYPE html>
<html lang="en">
    <head>
        <script type="text/javascript" src="{{$path}}"></script>
    </head>

    <body></body>

</html>

功能

function jsview($path)
{
    return view('javascript', ['path' => $path]);
}

用法

<?php

Route::get('/test', function()
{
    return jsview('/assets/my.js');
});

这个答案并不完全完整,因为您的浏览器将从public/ 目录加载文件,因此您以这种方式指定的所有.js 文件都将从那里读取。我相信 Laravel 确实有一些与资源相关的东西,但我在这方面不够专业。

这只是为了概述如何实现您需要的东西,但不是开箱即用的。

【讨论】:

  • 但这会尝试加载一个仅包含 js 文件的整个 html 页面?与仅将一些 javascript 注入现有页面相反。例如,我的页面上有一个表单,提交后我想对某个路由进行 ajax 调用,该路由转到我的控制器,执行一些操作,然后返回一些 javascript 来操作页面,可能显示消息或其他内容。
  • 是的,这将加载一个带有一些 JS 的整个页面。如果你想组合你的视图并在它们之间共享数据,那么总是有@include 模板功能,如果你在模板组合之后。我理解你的问题的方式是你想在浏览器中执行一些.js,而不用经历&lt;script&gt;标签的麻烦。您可以定义一个包含多个 .js 文件的 .blade.php 文件,并且只需在目标 .blade.php 视图中定义 @include('my_js_bundle')
  • 非常感谢您的帮助,我在我的问题中添加了一个用例示例,希望这能解释我想要做什么。正如我所说,在 rails 中这很简单,您甚至可以使用 js.erb(它是刀片的 rails 等价物)在您的 javascript 中包含 php。所以你可以将评论 ID 或类似的东西传递给它。
  • @Brad - 这就是你所追求的吗:laravel.com/docs/5.4/blade#extending-blade - 使用你的自定义指令扩展刀片,如 @js('my.js') 似乎是你所追求的。
猜你喜欢
  • 2023-03-28
  • 2016-05-16
  • 2016-11-17
  • 2021-06-19
  • 2019-05-21
  • 2013-11-10
  • 2017-05-24
  • 2023-03-20
  • 1970-01-01
相关资源
最近更新 更多