Использование блейд-компонентов и javascript

#javascript #php #html #laravel #laravel-blade

#javascript #php #HTML #laravel #laravel-блейд

Вопрос:

Я использую Laravel, и я пытаюсь использовать javascript для заполнения списка пользователей. Проблема в том, что каждая запись списка основана на представлении, которое я создал в блейд-компоненте:

pro_list_entry.blade.php:

 @if( isset($pro_id) amp;amp; isset($pro_avatar) amp;amp; isset($pro_name))
    <a onclick='selectProfessional( {{ $pro_id }} , {{ $pro_avatar }}, {{ $pro_name }} )' style='cursor: pointer'>
        <div class='row'>
            <div class='col-4'>
                <img class='u-avatar rounded-circle' src='{{ $pro_avatar }}'>
            </div>
            <div class='col-8 d-flex align-items-center'>
                <h6 class='fm-wrapped-text'>{{ $pro_name }}</h6>
            </div>
        </div>
    </a>
 @endisset
  

Затем я хотел бы добавить все эти компоненты в список, используя Javascript:

 var listOfPhysicians = buildProfessionalListFromData(jsonData.professionals);

$('#pc_new_app_med_list').empty();
$('#pc_new_app_med_list').html(listOfPhysicians);
  

 function buildProfessionalListFromData(data) {
    var list = "";

    if (data != null) {
        for (i = 0; i < data.length; i  ) {

            var entry =
            "@component('patrons.clinic.shared.pro_list_entry')"
                  "@slot('pro_id')"   data[i].professional_id   "@endslot"
                  "@slot('pro_avatar') ../../user_uploads/avatars/"   data[i].avatar   "@endslot"
                  "@slot('pro_name')"   data[i].prefix   " "   data[i].first_name   " "   data[i].last_name   "@endslot"
              "@endcomponent";

            list = list   entry;
        }
    }
    return list;
}
  

После небольшого исследования я обнаружил, что то, что я пытаюсь сделать, просто невозможно.

Есть ли какой-либо другой способ сделать это? Добавление элементов списка, основанных на представлении, и заполнение их данными с помощью javascript? Возможно, я просто не вижу очевидного решения.

Любая помощь?

Спасибо.

Комментарии:

1. Вы не можете сделать это с помощью блейд-компонента. Блейд-компоненты отображаются на сервере в формате HTML, вы пытаетесь использовать манипуляции с dom на стороне клиента для добавления отображаемого на стороне сервера кода на свою страницу, это никогда не сработает.

2. @Joe Да. Я знаю, что: ( Как я уже сказал, «Я обнаружил, что то, что я пытаюсь сделать, просто невозможно». Однако мне все еще нужно решить проблему. Есть альтернативы?

3. Для этого я бы предложил использовать что-то вроде vue.js (или angular, или react). Откуда вы беретесь jsonData.professionals ? Это что-то, что пользователь загрузил?

4. Нет. Я удаляю его с помощью Ajax-вызова на сервер (на PHP), который, в свою очередь, извлекает и формирует данные из базы данных.

Ответ №1:

Вы можете написать свой блейд как обычно, как обычный, и отобразить его с помощью render() функции.

В вашем методе контроллера

  function foo()
 {
    $yourView= SELF::returnYourView();
    return json_encode(['yourView' => $yourView]);
 }

functionv returnYourView()
{
    return view('yourview')->render();
}
  

В вашем jquery

 $('your-parent-dev').html(response.yourview);
  

Комментарии:

1. Это хорошая идея, но не для этого случая в частности. Видите ли, я хочу, чтобы контроллер возвращал только данные, а не представления, поскольку этот запрос используется и для других целей. Но спасибо вам за предложение.

2. В итоге я использовал эту концепцию. Это, безусловно, лучший способ решить эту проблему. Спасибо.