Jak załadować niestandardowy plik js modułu w Magento 2?


9

Utworzyłem moduł suwaka banerowego dla magento 2. Plik JS wywołałem w następujący sposób i działając poprawnie. W klasie bloków stworzyłem następującą funkcję

public function getBaseJs($fileName){

        return $this->_storeManager->getStore()->getBaseUrl(
                \Magento\Framework\UrlInterface::URL_TYPE_MEDIA
            ).'bannerslider/js/'.$fileName;
    }

i ta funkcja jest wywoływana w bannerslider.phtmlpliku w następujący sposób.

<script type="text/javascript" src="<?php echo $this->getBaseJs('jquery-1.7.min.js') ?>"></script>
<script type="text/javascript" src="<?php echo $this->getBaseJs('jquery.flexslider.js') ?>"></script>

Ale zgodnie z mechanizmem zależności jQuery w require.jsJak mogę to zrobić?

Odpowiedzi:


29

Wreszcie mam rozwiązanie dla mojego zapytania. Chciałbym udostępnić to szczegółowo, jak poniżej.

wprowadź opis zdjęcia tutaj

Krok 1: Dodaj plik js modułu pod<Vendor>/<Module_Name>/view/<area>/web/js/

na przykład <Vendor>/<Module_Name>/view/<area>/web/js/flexslider.js

Krok 2: Utwórz requirejs-config.jsplik pod<Vendor>/<Module_Name>/view/<area>/

na przykład <Vendor>/<Module_Name>/view/<frontend>/requirejs-config.js

Dodaj następujący kod do requirejs-config.js

var config = {
    map: {
        '*': {
            bannerslider: 'VendorName_ModuleName/js/flexslider'
        }
    }
};

Uwaga: możesz ustawić nazwę swojego obiektu według własnego wyboru. W moim przypadku ustawiłem jako bannerslideri nie dodam rozszerzenia .js do nazwy pliku wVendorName_ModuleName/js/flexslider

Krok 3: Wywołaj plik functionjs modułu w .phtmlpliku w następujący sposób.

<script type="text/javascript">
    require(['jquery','bannerslider'],function($){
        $(window).load(function() {
            $('.flexslider-8').flexslider({
                animation: "fade",
                controlNav: "thumbnails",
                slideshowSpeed: 2000,
                minItems: 2,
                maxItems: 4
            });
        });

    });
</script>

Dla mnie działa dobrze.

Śledzenie: użyj Netkarty, aby zobaczyć żądany adres URL załadowanego pliku js lub nie.

wprowadź opis zdjęcia tutaj


4
lepiej użyć „domReady!” wtyczka zamiast $ (okno) .load (), na przykład wymaga (['jquery', 'bannerlider', 'domReady!], funkcja ($) {... kod wykonywany tylko po załadowaniu dom})
— KAndy

Tak, to będzie bardzo przydatne.
— Praful Rajput,

@ Cóż, to zależy, jeśli chcesz, aby skrypt był wykonywany jako ostatni, czy nie lepiej jest użyć $ (okno)? czy to nie powoduje, że skrypt działa nie tylko po odczytaniu DOM, ale także po uruchomieniu wszystkich skryptów?
— Lachezar Raychev

I ten sposób dla mnie nie działa ... mówi static / adminhtml / Magento / backend / en_US / gift.js 404 (Nie znaleziono) Wyczyściłem pamięć podręczną i pub / static ... bot nie .. nie działa
— Lachezar Raychev

podrap, to działa ... domReady! nie działa jednak ... jak mogę powiedzieć skryptowi, aby uruchomił się po załadowaniu wszystkich innych skryptów, czy nie istnieje w obecnej metodologii magent2?
— Lachezar Raychev

4

Moja droga to:

Krok 1

Dołącz podstawowy plik javascript rozszerzenia przy użyciu instrukcji układu.

Krok 2

Wymagaj innych plików javascript rozszerzenia z pliku podstawowego za pomocą RequireJS:

require(
    [
      'jquery', 
      '{VendorName}_{ModuleName}{path_to_js_file/relative_to/view/web/no_js_at_end}'
     // ex. Magento/Ui/view/base/web/js/grid/sticky/sticky.js
     // became Magento_Ui/js/grid/sticky/stick
    ], 
    function($, someOtherLibrary) {
        // custom code here...
    );
});

1
dostał błąd wymagany nie jest zdefiniowany, ponieważ mój plik js jest ładowany przed wymaganym
— prosty facet
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.