Laravel, правильный способ импорта javascript в шаблоны Blade

Я использую Laravel 5.6. Эта страница у меня не работал.

pizza / index.blade.php выглядит так:

@extends('layouts.app')


@section('content')
    <!-- Styles -->
    <link href = "{{ asset('css/pizza.css') }}" rel = "stylesheet">
    <!-- Scripts -->
    <script src = "{{ asset('js/components/pizza.js')}}"></script>
    <div class = "container">
        <div class = "row justify-content-center">
            <div class = "card">
                <div class = "card-header">Pizza</div>
                <div class = "card-body">
                    <form action = "/pizzas" method = "post">
                        @if ($errors->any())
                            <div class = "alert alert-danger" role = "alert">
                                Please fix the following errors
                            </div>
                        @endif
                        @include('pizza.table')
                    </form>
                </div>
            </div>
        </div>
    </div>
@endsection

пицца / table.blade.php:

<div class = "pizza-selection">
    <b>Thanks god its pizza day! Select your pizza of the day!</b>
    <table id = "pizzas" class = "md-box">
        <tr>
            ...
        </tr>
        @foreach ($pizzas as $pizza)
            ...
        @endforeach
        <tr>
            ...
            <input type = "button" class = "md-box btn btn-default" 
             id = "add_new_pizza" onClick = "addPizza()" value = "Add Pizza!">
            </td>
        </tr>
    </table>
    ...

Я получаю справочную ошибку, когда нажимаю кнопку «add_new_pizza», onClick = «addPizza ()», addPizza () не определен. Однако я пытаюсь импортировать pizza.js в index.blade.php

<script src = "{{ asset('js/components/pizza.js')}}"></script>

распечатка ресурса ('js / components / pizza.js') возвращает http: // локальный: 8080 / js / компоненты / pizza.js, который мне кажется правильным.

public / js / components / pizza.js выглядит следующим образом:

import PizzaService from '../services/PizzaService.js';

async function addPizza(){
    // some functionality
}

Это также работало, когда у меня была функция addPizza () внутри скрипта на .blade.php.

Также найдите репозиторий на GitHub, если вам понадобится дополнительная проверка кода: https://github.com/andrelandgraf/laravel-docker

Обновлено: когда я копирую pizza.js внутри <script><script>, он работает нормально, но я получаю SyntaxError: import declarations may only appear at top level of a module. Эта ошибка SyntaxError исчезает, когда я импортирую скрипт через src, как вы можете видеть в моих примерах кода. Для меня это означает, что скрипт вообще не загружается.

EDIT2 и решение: я использовал решение @kerbholz. Я добавил @stack('scripts') в нижнюю часть body в app.blade.php и внутри @section('content') из index.blade.php, я знаю @push('stack') файл pizza.js.

Я сделал еще один шаг, но все еще получаю SyntaxError, указанное в EDIT. Есть ли обходной путь для этого, или мне просто нужно удалить импорт PizzaService.js и добавить <scipt>-Tag для этого файла?

EDIT3: Хорошо, эта проблема не связана. Похоже, что модули ES6 еще не поддерживаются браузерами.

Все, что находится за пределами вашего блока @section, не будет отображаться.

brombeer 30.07.2018 12:38

@kerbholz большое спасибо, я этого не знал. Я только начал использовать laravel. Я отредактировал свой вопрос, чтобы исправить эту проблему, но все равно получаю то же сообщение об ошибке.

Andre 30.07.2018 12:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
30
2
82 538
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Все, что находится за пределами вашего блока @section, не будет отображаться.

Вы можете отредактировать свой layouts/app.blade.php и добавить @stack('head') там, где вы хотите, чтобы ваши стили / javascript отображались (желательно в разделе <head> вашего HTML).

В любом файле лезвия, который @extends('layouts.app'), вы можете затем использовать

@push('head')
<!-- Styles -->
<link href = "{{ asset('css/pizza.css') }}" rel = "stylesheet">
<!-- Scripts -->
<script src = "{{ asset('js/components/pizza.js')}}"></script>
@endpush

чтобы поместить содержимое в этот стек.

Для получения дополнительной информации посетите https://laravel.com/docs/5.6/blade#stacks

Спасибо за ответ. Я отредактировал свой вопрос и поместил два сценария в @section, но все равно получаю ту же ошибку. Когда я пробую ваше решение, оно отключает мой css, и я получаю ту же ошибку, что и раньше, в отношении функции addPizza. Я также попытался добавить @stack ('scripts') в заголовок app.blade.php и нажать на скрипты ...

Andre 30.07.2018 12:52

У меня обычно @stack('head') в голове и @stack('scripts') в конце app.blade.php. Я бы сделал это так, чтобы создать файл resources/assets/js/_pizza.js, а затем require('./pizza'); в моем app.js. (И, конечно же, загрузить app.js в мой app.blade.php)

brombeer 30.07.2018 14:31

Спасибо за вашу поддержку @kerbholz. Теперь он у меня работает. push('scripts') у меня работал!

Andre 30.07.2018 16:24

Это так раздражает, что я не могу связаться с вами напрямую через личное сообщение или что-то в этом роде. Тем не менее, это сработало для меня, поэтому я перестал думать об этом, но мне было интересно, так как я прочитал ваш комментарий. Как вы используете require ('./ pizza') в laravel? Насколько мне известно, require исходит от nodejs и недоступен в обычном js, верно?

Andre 01.08.2018 18:11

@Andre require недоступен в простом JS, верно. Думаю, это из webpack / смешивание.

brombeer 02.08.2018 10:51

War mir ein Vergnügen;)

brombeer 02.08.2018 12:13

импортировать файл js в голову - плохая практика

MH Fuad 11.04.2020 21:21

Вот почему существует "Обычно у меня есть @stack ('голова') в голове и @stack ('scripts') в конце app.blade.php."

brombeer 11.04.2020 21:33

Попробуйте переместить pizza.js в конец index.blade.php

    @section('extra-script')

    {{Html::script('js/components/pizza.js')}}

    @endsection

Надеюсь, поможет.

Спасибо за ответ! Я видел Html :: раньше, но он недоступен в шаблоне blade.php. Откуда вы берете класс Html?

Andre 30.07.2018 12:54

Ваш config / app.php должен содержать следующий код в массиве поставщиков 'providers' => [ Collective\Html\HtmlServiceProvider::class, ], а псевдонимы должны содержать 'aliases' => [ 'Form' => Collective\Html\FormFacade::class, 'HTML' => Collective\Html\HtmlFacade::class, ]. Вы также можете добавить: <script src = "{{asset ('js / components / pizza.js')}}"> </ script > если html не работает.

Zeeshan Tariq 30.07.2018 13:03

Я вижу, что Laravel Collective - это еще один упаковка, который у меня не установлен.

Andre 30.07.2018 13:13

Я использовал asset () сейчас в вашем решении, я все еще получаю ту же ошибку ...

Andre 30.07.2018 13:15

Конечно, но они не особо помогают: веб-консоль говорит: ReferenceError: addPizza is not defined. onClick localhost:8080/pizzas:1:1

Andre 30.07.2018 13:31

Для пользовательских скриптов на определенной странице,

  • добавить @yield('footer-scripts') к layouts/app.blade.php

  • создать папку с именем 'scripts' в папке просмотров

  • внутри папки views/scripts создайте файл 'pizza-script.blade.php' и добавьте содержимое файла js внутрь

    <script src = "/path/to/pizza.js" />   <!-- it might not work if path isn't clear -->
    
    <script type = "text/javascript">
        console.info('executing js here..')
       js file contents....
    
      #if jquery needed add it like, 
    
      $(document).ready(function(){
        ...
      }
    </script>
    
  • в вашем index.blade.php (или странице, где вы хотите, чтобы скрипты выполнялись) в конце добавьте скрипт после @endsection

      @section('footer-scripts')
          @include('scripts.pizza-script')
      @endsection
    

теперь обновите страницу, вы увидите 'executing js here..' на консоли.

Другие вопросы по теме