2015-11-18 5 views
0

У меня есть запрос AJAX к серверу, сервер возвращает некоторые данные, а затем в функции обратного вызова у меня есть resultStr, который будет помещен в цель <div>. resultStr выполняет итерацию на длину объекта и выполняет итерацию по всем данным, которые мне нужно показать. Дело в том, что Blade не анализирует синтаксис, если вы переместите JavaScript в отдельный файл в активы, чтобы данные не отображались. Некоторые говорят: поместите переменные в представление PHP, а затем установите их в JavaScript. Это нехорошо, так как, например, токен CSRF становится видимым в представлении источника. Кроме того, он не работает для перебора данных. Скажем, на мой взгляд, я передал некоторые данные, такие как:Какое решение для использования лезвия в функциях обратного вызова javascript?

'items' => $items 

Тогда мне нужно, чтобы заполнить страницу после вызова AJAX со всеми $items. resultStr в функции обратного вызова имеет что-то вроде:

"foreach ($items as $i)" + 

"<option value=\"{{ $item->id }}\">{{ ($item->name) }}</option>" 

Как лезвие не разбор строки результата он просто не будет работать, и я не могу объявить эти переменные ($items и $i) в PHP части. Это не имеет смысла, и если я попытаюсь сделать все, что я получаю, это undefined variable.

Итак, какое решение должно сделать Blade, проанализировать resultStr и разместить JavaScript в отдельном файле?

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

jQuery(function ($) { 
    $(document).ready(function() { 
     var form = $('form'); 
     form.submit(function (e) { 
      e.preventDefault(); 
      $.ajax({ 
       url: form.prop('action'), 
       type: 'post', 
       dataType: 'json', 
       data: form.serialize(), 
       success: function (data) { 

        var obj = (data); 
        var results = ""; 
        var filler; 
        $.ajax('js/blade/filler.blade.php', { 
         dataType: 'text', 
         success: function (data) { 
          filler = data; 
          for (var i = 0; i < obj.length; i++) { 

           results = results + filler; 

           $("#results").html(results); 

          } 

         } 
        }); 

       } 

      }) 
     }); 

    }); 
}); 
+0

Вы не можете разбирать шаблоны Blade в JavaScript, поскольку компилятор Blade принимает строку шаблона и анализирует такие вещи, как переменные и структуры управления ('@ foreach' и т. Д.). Вам нужно будет сделать это на стороне сервера. –

+1

Также: «Это не так хорошо, как, например, токен CSRF становится видимым в представлении источника». Ваш токен CSRF виден _anyone_, который каким-либо образом просматривает источник вашего приложения Laravel. Это не секретный токен, он просто предназначен для того, чтобы люди не отправляли данные формы в ваше приложение с других сайтов. –

+0

«Вы не можете анализировать шаблоны Blade в JavaScript», синтаксис лезвия анализируется, если вы оставите скрипт в представлении, что я хочу достичь, это отдельный сценарий из представления. Мой скрипт возвращает результатStr, содержащий синтаксис лезвия. Я пробовал вот так: отделите скрипт в script.js и resultStr.blade.php, затем загрузите скрипт resultStr.blade.php и поместите в строку, но не сработает.Пожалуйста, ознакомьтесь с обновленным сообщением – Chriz74

ответ

0

Как говорит @MartinBean, вы не можете разобрать лезвие на Javascript, потому что это PHP, и вы не можете выполнить PHP непосредственно через Javascript, это язык на стороне сервера.

подход мог бы делать запрос Аякса тем, что есть что-то вроде этого:

<?php 
echo json_encode($items); 

И затем, в функции Ajax вы можете использовать что-то вроде этого:

var form = $('form'); 
var display_div = $('#display_div'); 
form.submit(function (e) { 
    e.preventDefault(); 
    $.ajax({ 
     url: form.attr('action'), // <form action="site.com/some-view"> 
     data: form.serialize(), 
     type: 'post' 
    }).done(function (data) { 
     var parsed_data = $.parseJSON(data); 
     $.each(parsed_data,function(key,value) 
     { 
      display_div.append('<option value="'+key+'">'+value+'</option>'); 
     }); 
    }); 
}); 

I рекомендую вам сделать всю логику в этом ajax-запросе, если это возможно, чтобы все было в одном.

0

Просто добавьте к вопросу: я переместил все генераторы переменных и прочее на контроллер. Теперь, когда я отправляю форму, все необходимые данные передаются в jquery в объекте и затем используются для генерации результатаStr. Ошибка передавала некоторые переменные на страницу формы, а затем пыталась использовать их после отправки.