【问题标题】:Escaping Laravel Blade @include Contents for JavaScript为 JavaScript 转义 Laravel Blade @include 内容
【发布时间】:2019-04-03 14:20:48
【问题描述】:

我正在使用 Laravel 中的动态表单。

我已经将可重用的表单位抽象为 @include,并使用一些 JS 逻辑来处理基于用户添加另一个小部件时传递的 id 递增的表单 name=[] id。

当用户点击向表单添加另一个小部件时,我想简单地调用包含递增计数器 - 全部排序 - 但是,@include 的输出是对 JavaScript 不友好。

四处搜索,我发现了以下内容:

https://laracasts.com/discuss/channels/general-discussion/blade-content-escaping

...似乎扩展刀片以创建自定义指令可能是答案:

https://laravel.com/docs/5.7/blade#extending-blade

我的问题是,我是否可以用自定义指令包装 @include,比如 @js(@include()) - 或者 - 这根本不是可行的方法吗?

这是我整个项目中这个结构的唯一实例,所以我没有使用 VUE。

谢谢。

编辑:

我尝试将指令放在一起

Blade::directive('js', function ($expression) { return str_replace(array(' ', "\n", "\t", "\r"), '', $expression); });

问题是@include 没有评估...兔子洞

【问题讨论】:

    标签: javascript laravel laravel-blade


    【解决方案1】:

    我能够使用自定义刀片指令来完成此操作:

    AppServiceProvider

    Blade::directive('js', function ($expression) { return "<?php echo trim(preg_replace('/\s+/', ' ', \$__env->make({$expression}))); ?>"; });

    刀片中的 JS

    var newWidget = '@js("components.widgets", ["widgetId" => 'widgetId'])'; newWidget = newWidget.replace(/widgetId/g,widgetId);

    我正在使用替换来插入递增的 widgetId。

    感谢大家的意见。

    【讨论】:

      【解决方案2】:

      这个怎么样:

      <table id="myTable">
      <tr>
      <td>{{ Form::input('text', 'first_name[]', null) }}</td>
      </tr>
      </table>
      {{ Form::button('add', ['id' => 'add']) }}
      
      $('#add').click(function() {    
          $.ajax({
          url:"/mylink",
          method:"GET",
          success:function(data){
             $('#myTable tr').last().after('<tr>' + data + '</tr>');      
          }
        });
      });
      

      在你的控制器上

      public function myMethod()
      {
         $data = view('myviewfile')->render();
         return response()->json(['html'=>$data]);
      }
      

      在你的路线上:

      Route::get('/mylink', 'MyController@myMethod')->name('myRouteName');
      

      【讨论】:

        【解决方案3】:

        您不能直接将 Blade 模板输出分配给 JavaScript 变量,但您可以使 Blade 输出不可见 (display: none) 并使用 Javascript 引用它。

        I.E.而不是:

        var JsElement = @include('blade.template', $data)
        

        您可以在刀片页面中执行此操作:

        <div id="template-element" style="display: none">
            @include('blade.template', $data)
        </div>
        

        然后通过javascript引用和克隆它:

        var JsElement = document.getElementById('template-element');
        var clonedElement = JsElement.cloneNode()
        

        【讨论】:

          【解决方案4】:

          这就是我之前的做法:

          <table id="myTable">
          <tr>
          <td>{{ Form::input('text', 'first_name[]', null) }}</td>
          </tr>
          </table>
          {{ Form::button('add', ['id' => 'add']) }}
          
          <script>
           $('#add').click(function() {    
              var newrow = $('#myTable tr:last').html();    
              $('#myTable tr').last().after('<tr>' + newrow + '</tr>');
            });
          </script>
          

          这只是一个粗略的示例,但应该足以让您入门。

          【讨论】:

          • 这并没有解决我的问题,即如何正确转义刀片中 @include 的内容以分配给 javascript 变量。添加/删除等的“动态”功能已全部设置。不过感谢您的回复。
          • 如果您需要使用刀片文件的内容,那么您需要为此使用 ajax 调用
          猜你喜欢
          • 2014-02-06
          • 2014-12-10
          • 1970-01-01
          • 2021-09-18
          • 2018-03-22
          • 2016-05-19
          • 2016-02-27
          • 2017-01-26
          • 2014-02-24
          相关资源
          最近更新 更多