Как инициализировать ваше магистральное приложение в require.js после внешнего обратного вызова - PullRequest
7 голосов
/ 05 января 2012

Обычно вы загружаете приложение Backbone с использованием require.js во время загрузки страницы

<script data-main="js/main" src="js/libs/require/require.js"></script>

, которое загружает некоторые зависимости и запускает приложение.

Если ваше приложение требует манипулирования DOM, вы можете использовать плагин domReady

require(['domReady','app' ], function (domReady, App) {
  domReady(function (App) {
     App.Initialize()
  }):
});

Но мое приложение взаимодействует с Flash API.Мне нужно подождать, пока флэш-плагин не загрузит свой собственный XML.Я сделаю обратный вызов обратно в JavaScript, когда это будет сделано.Этот обратный вызов должен запускать app.initialize () с зависимостями, как в require.js

Первый и второй методы (ожидающие dom) еще не гарантируют, что flash api доступен.Итак, как я могу инициализировать приложение, чтобы app.js имел свои зависимости и был доступен flash api.Или сформулированы по-другому: Как я могу инициализировать require.js через событие / обратный вызов javascript

Обновление: Очевидно, этого будет достаточно:

<script data-main="js/main" src="js/libs/require/require.js"></script>
<script type="text/javascript">
    function init(){
        require(['framework/app'], function(App){
          App.initialize();
        });
    }       
</script>

Плагин Flash можетпросто вызовите window.init (), чтобы запустить приложение.Недостатком может быть то, что jQuery загружается при инициализации приложения.Это может привести к небольшой задержке перед тем, как что-либо отобразится.

Мне интересно, если при загрузке jquery в начало / конец тела, require.js перезагрузит / создаст другую копию jquery или прочитает из кеша /дом

Ответы [ 2 ]

1 голос
/ 05 ноября 2013

Вы можете воспользоваться конфигом requirejs shim, который позволит вам определить «экспорт» для указанных требуемых модулей.Этот экспорт будет значением, кэшированным в глобальном контексте, и будет доступен для использования в качестве функции обратного вызова:

<script data-main="js/main" src="js/libs/require/require.js"></script>
<script type="text/javascript">
    requirejs.config({
        shim: {
            'framework/app': {
                exports: 'App'
            }
        }
    });
    require(['framework/app'], function(App){});
</script>

Отсюда ваш код, который вызывает функцию javascript, может просто вызвать:

App.initialize();
0 голосов
/ 15 января 2012

Я не знаю много (на самом деле ничего) о Flash в браузере, но если есть способ обнаружить с помощью JavaScript, что Flash загрузил:

  1. Сделайте Flash изменяющим JavaScript глобальнымпеременная
  2. Заставьте Flash добавить атрибут к некоторым элементам

Затем вы можете создать функцию JavaScript, которая проверяет это условие (например, каждую секунду) и инициализировать приложение после проверкиподтверждено.Используйте setInterval(function, time) для создания этой функции.Обязательно очистите интервал после загрузки приложения, чтобы оно больше не загружалось.

...