如何从 textarea 中的 @foreach 循环呈现 html

Posted

技术标签:

【中文标题】如何从 textarea 中的 @foreach 循环呈现 html【英文标题】:How to render html from a @foreach loop in a textarea 【发布时间】:2021-01-28 12:28:48 【问题描述】:

使用 Laravel 8 livewire,我需要在 textarea 中的每一行呈现一个名称列表 ($list)。 我这样做

<div class=" border border-red-800 rounded-lg mt-8 p-4 w-full bg-green-300">
    <form>

        <textarea rows="10"  class="w-full bg-yellow-100">
        
            @foreach ($list as $maltproducer)
                $maltproducer->name
            @endforeach

        </textarea>
        <x-input.group label="Producer" for='name' :error="$errors->first('name')"
            class="flex flex-col w-full p-2 border border-jbrown-peachpuf bg-jbrown-darker rounded-md ">
            <x-input.text wire:model="name" type="text" class="" name="name" id="name" value="" />
        </x-input.group>
        <button wire:click.prevent="store()" class="bg-red-400 px-2 py-1 border rounded-lg mt-2">Add this
            producer</button>
    </form>
</div>

名称每行显示一个,但不在行首。要将它们放在行首,我必须将我的源代码移动到行首,如下所示。

@foreach ($list as $maltproducer) 
$maltproducer->name 
@endforeach

这是不可接受的,因为代码编辑器可能会在我不知道的情况下对文件进行不同的格式设置。 我尝试了各种方法,例如

@foreach ($list as $maltproducer)
  <p>$maltproducer->name</p>
@endforeach

但在这种情况下,&lt;p&gt; 标记会显示但不会被解释。

我也尝试过!!$maltproducer-&gt;name!!!!&lt;p&gt;$maltproducer-&gt;name&lt;/p&gt;!! 等,但我永远无法获得好的结果,即在每行的开头有一个名字。

解决办法是什么?

【问题讨论】:

【参考方案1】:

文本区域将其标签之间的所有内容呈现为值 - 这包括空格、制表符和换行符。所以你想在你想要的实际值之前或之后打印每一行而不带任何空格。为了最好地做到这一点,是在代码中打印没有任何“漂亮”格式的输出。

我们可以通过提取您要打印的集合中的字段来实现这一点,然后用换行符作为粘合剂将其分解。在 php 中,这看起来像

implode("\n", $list->pluck('name'))

然后它只是直接在文本区域之间打印,没有任何间距或换行符。

<textarea rows="10" class="w-full bg-yellow-100"> implode("\n", $list->pluck('name')) </textarea>

更接近 Laravel,直接在集合上使用 implode() 方法,

<textarea rows="10" class="w-full bg-yellow-100"> $list->implode('name', "\n") </textarea>

【讨论】:

感谢您的回答。不幸的是,它不起作用。我有一个 implode 错误:ErrorException implode(): Invalid arguments passed (查看:/ORIGINAL-P1/LARAVEL/EASYBEER/resources/views/livewire/malt/producer-lw.blade.php) (查看:/ORIGINAL-P1 /LARAVEL/EASYBEER/resources/views/livewire/malt/producer-lw.blade.php) 如果我只使用 $list->pluck('name') 我得到一个数组 ['name1',"name2",.. ..,"nameX"] 是正确的,因此我不明白错误来自哪里。 嗯.. dd($list-&gt;pluck('name')); 是什么?它是什么类型的,它只是一个带有一堆名称的一维数组吗? 你也可以直接使用 $list-&gt;implode('name', "\n") ,试试看 最后一个提案只有第一行有前导空格。这是 dd($list->pluck('name') 的输出: Illuminate\Database\Eloquent\Collection #435 ▼ #items: array:3 [▼ 0 => App\Models\Malt\Producer #436 ▶ 1 => App\Models\Malt\Producer #437 ▶ 2 => App\Models\Malt\Producer #438 ▶ ] 请参阅编辑############# #########在原帖中 $list-&gt;implode('name', "\n") 自己应该可以正常工作。但正如我在回答中所说,&lt;textarea&gt; 标签之间不应有任何空格或换行符。它需要完全是我在上面发布的片段,而不是用换行符格式化。

以上是关于如何从 textarea 中的 @foreach 循环呈现 html的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Internet Explorer 中的父元素继承 textarea 的背景颜色?

如何从Laravel 5.2中的textarea获得价值?

如何在不刷新页面的情况下从数据库中的textarea添加数据[重复]

如何从数组中的 textarea HTML 标记中获取数据,然后循环遍历它?

如何将换行符从 HTML div 复制到 jQuery 中的 textarea?

从webdriver中的textarea读取文本