Как перезагрузить Laravel @include с помощью AJAX? - PullRequest
0 голосов
/ 07 июня 2019

Внутри моего более крупного приложения есть одностраничное приложение, которое будет отправлять данные в БД, а также отображать данные той же таблицы.В настоящее время у меня AJAX динамически отправляет данные.Однако, чтобы данные, которые только что были вставлены, отображались в той таблице, которую я хочу, мне нужно обновить.Я пробовал вещи все утро, но ниже - текущее состояние вещей.

Вид:

<html>
  <head>
    <!--I took some stuff out to make it easier to look at -->
  </head>
  <body onresize="resizeRecalc()">
    <div class="container-fluid">
      <div class="row header">
        <div class="col-12">
          <img src="{{ URL::asset('images/takeStatsLogo.png') }}" id="header-logo" />
        </div>
      </div>
      <div class="mainArea row">
        <div class="left col-8">
          <div onclick="playPause()" class="embed-responsive embed-responsive-16by9">
            <video id="gameFilm" src="{{ URL::asset('images/basketball.mp4') }}" preload="metadata"></video>
          </div>

          <div class="timebar">
            <span class="timeItem" id="timestamp"></span>
            <div onclick="changeVidTime()" onmousemove="moveLine(event)" onmouseout="REmoveLine()" id="outerBox"> <div id="progressBox"> <div id="placeMarker">
                </div></div></div>
            <span class="timeItem" id="duration-place"></span>
          </div>

          <!-- This is a key part -->
          <div id="statList">
              @include('partials.statList')
          </div>
        </div>

        <div id="right" class="right col-4">
          <!--Checking if we should make the user select starters. If we have them, no need to do that...-->
          @if ($game->starters != null)
              @include('partials.areStarters')
          @else
              @include('partials.noStarters')
          @endif
        </div>
      </div>
    </div>
    <script>
      //Add Stat Form
      //This part here will add the stats, but it won't refresh them!
      $('input#addStatButton').click( function() {
          $.post( '{{action("StatController@store")}}', $('form#new_stat').serialize(), function(data) {
                $('#statList').load('/take-stats/{{$game->id}}');
             },
             'json' // I expect a JSON response
          );
          clearStat();
      });
    </script>
    <script src="{{ URL::asset('js/takeStats/genJavascript.js') }}"></script>
    <script src="{{ URL::asset('js/takeStats/videoJS.js') }}"></script>
    <script src="{{ URL::asset('js/takeStats/dataJS.js') }}"></script>
  </body>
</html>

Вот метод контроллера:

public function loadStatList($id) {
    $userType = Auth::user()->user_type;
    if(Auth::check() && Game::where('id', '=', $id)->exists() && ($userType == 'statistician' || $userType == 'admin')) {
        $game = Game::find($id);
        $players = $game->team->users->where('user_type', 'player');
        $stats = Stat::orderBy('video_timestamp', 'desc')->where('game_id', $game->id)->get();
        $statMeta = Stat_Meta::all()->where('type', 'recorded');
        return view('partials.statList', compact('game', 'players', 'stats', 'statMeta'));
    } else {
        abort(404);
    }
}

Возможно, я что-то упустил, но я думал, что это сделает то, что я пытаюсь достичь.

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Я понял! Спасибо @ Get Off My Lawn за подсказку, что я не могу просто использовать @include.Я пошел дальше и выяснил, как предварительно отрендерить HTML, а затем ввести его. На самом деле это не так сложно.Идея здесь состоит в том, чтобы использовать функцию JQuery для выполнения AJAX POST после нажатия кнопки submit, а затем использовать .done для получения новой полной веб-страницы.После того, как вы это сделаете (вы можете console.log, чтобы увидеть, с чем вы работаете в данный момент, это будет вся веб-страница), вы можете просто получить конкретный div, который вы хотите обновить, из .get, который вы выполнили, и придерживатьсяэто в том же div.Вот код:

HTML / @ include:

<div id="statList">
   @include('partials.statList')
</div>

AJAX / JQuery:

$('input#addStatButton').click( function() {
    $.ajax({
      type: 'POST',
      url: '{{action("StatController@store")}}',
      data: $('form#new_stat').serialize(),
    })
    .done(function(refresh) {
      clearStat();
      $.get('{{action("StatController@show", [$game->id])}}', function(data) {
        var newData = $("#statList" , data)
        $( "#statList" ).html( newData );
        //console.log(newData);
      });
    });
  });

Я ТАК СЧАСТЛИВЫ !!!

0 голосов
/ 18 июня 2019

Как уже говорилось, это не ответ на ваш вопрос, а простое объяснение, которое вы задали в комментариях.И это может помочь кому-то еще

Laravel and JQuery

Насколько мощным: -)

Сначала я постараюсь максимально приспособить это к вашим потребностям с помощью информации, которую вы

Во-вторых, jquery содержит несколько классных функций для задниц, о которых многие люди не знают.

Как вы описали, у вас есть одностраничный веб-сайт или что-то в этом роде.Это означает, что у вас есть 1 route, чтобы показать одну страницу, которую я предлагаю /take-stats/{{$game->id}}.В вашем контроллере и в качестве примера я использую GameController, у вас есть что-то вроде следующего.

class GameController
{

 public function __construct()
 {

 }

 //the single page view
 public function index()
 {
     //your singlepage logic here....

     return view('games.index'); //something like this?
 }

 public function create() //this is where you post to
 {
    //logic to store the game stats...

    //this is where you return a succes message or something.
    //lets return the index instead :-)

    //dont't return $this->index! use redirect to the route.
    return redirect()->route('the.route.to.your.index');
 }


}

Как вы видите выше, мы возвращаем одну страницу в ответном сообщении.SSo, когда вы публикуете метод store, и он успешно выполняется, он возвращает страницу индекса.

Теперь jquery.

$('input#addStatButton').on( function() {
   //this is where to do the post.
    $.post(`{{ route('to.your.store.route') }}`, $('form#new_stat').serialize(), (response) => {

      //clear the stats because the post is succeeded in here
      //also reload the content. The response contains the new html content

      //now what we can do is replace the whole content....
      //something like $(`html`).html('response);
      //or we get the content we need from the response and this is where jquery comes in handy. The response is simply a html response so jquery can create a new dom from it.

      let statsList = $(response).find(`#statslist`).html(); //create a dom element of the response.
      $(`#statslist`).html(statslist); //put the filtered html in the current list.
      //thats all :-)
    }).fail(() => {
      // a fail save. When the post fails it will come in here.
    }).always(() => {
      clearStats(); 
      //this is called always even when it fails. You can clear the stats or something in here.
    });

});

Краткое описание:

  • Нажмите кнопку «Отправить», отправьте сообщение на post.route
  • Метод контроллера выполняет логику и возвращает в качестве успеха индексный URL.
  • jquery анализирует HTML-ответ и заменяет исходное содержимое.
  • готово.

Надеюсь, это поможет вам или кому-то еще.При использовании структуры, подобной приведенной выше, этот код становится чище и быстрее, поскольку он выполняет только один запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...