иметь requirejs для запуска обратного вызова при загрузке модуля

Мне нужно загрузить CSS, когда мой модуль загружен, поэтому я сделал это с помощью прокладок:

function loadCss(url) {
    var link = document.createElement("link");
    link.type = "text/css";
    link.rel = "stylesheet";
    link.href = url;
    document.getElementsByTagName("head")[0].appendChild(link);
}

requirejs.config({ paths: paths, shim: {
    'easyzoom': {
        'deps': ['jquery'],
        init: function () { loadCss('/lib/easyzoom/css/easyzoom.css'); }
    }}
});

Это работает для других библиотек, таких как Datatables, потому что они не являются модулями AMD. Но для модулей Amd requireJs не ищет прокладки, поэтому не вызовет мою функцию инициализации.

Есть ли способ вызвать обратный вызов после загрузки модуля? Или загрузить модуль Amd, поскольку это был простой файл javascript для поиска прокладок?


person yeska    schedule 05.09.2015    source источник


Ответы (1)


Определение shim для правильного модуля AMD (того, который вызывает define) приводит к неопределенному поведению.

Что вы можете сделать, так это использовать map следующим образом:

map: {
    '*': {
        easyzoom: 'easyzoom-intercept'
    },
    'easyzoom-intercept': {
        easyzoom: 'easyzoom'
    }
}

Это означает, что когда какой-либо модуль ('*') требует модуль easyzoom, вместо него следует загрузить модуль easyzoom-intercept. Однако, когда easysoom-intercept хочет загрузить easyzoom, следует загрузить модуль easyzoom. Затем вы создаете модуль easyzoom-intercept следующим образом:

define([easyzoom], function (ez) {
    loadCss('/lib/easyzoom/css/easyzoom.css');
    return ez;
});

Этот код будет выполнен, как только будет загружен easyzoom.

person Louis    schedule 06.09.2015
comment
Спасибо ! для загрузки css require-css хорош, но ваш ответ идеально подходит для моего вопроса. - person yeska; 07.09.2015