2013-04-23 3 views
3

Как использовать API Bing Maps с последней версией RequireJS? URL удаленного скрипта:Как использовать Bing Maps API с RequireJS?

http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0

бы я просто добавить подкладку, как это?

require.config({ 
    /* ... */ 
    paths: { 
     'Microsoft.Maps': 'http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0' 
    }, 
    shim: { 
     'Microsoft.Maps': { 
      deps: [], 
      exports: 'Microsoft' 
     } 
    } 
}); 

И затем использовать его в своих модулях, как это:

define(['Microsoft.Maps'], function(Microsoft) { 
    /* ... */ 
}); 

Я думаю, мой вопрос о том, как использовать код пространства имён вообще с RequireJS. Документы не входят ни в какие примеры, которые я мог бы найти.

ответ

6

Оказывается, что вы можете сделать это с async плагиным, например, так:

define([ 
    'async!http://ecn.dev.virtualearth.net/mapcontrol/mapcontrol.ashx?v=7.0!onscriptload' 
], function() { 
    // Microsoft and Microsoft.Maps will be available here 
}); 

async! бит говорит RequireJS использовать async плагина, и !onscriptload бит говорят для отправки автоматически сгенерированным имя обратного вызова в параметре URL onscriptload. Когда Bing будет загружен все активы, он отправит ответ JSONP, который вызывает любой обратный вызов плагина async, предоставленного ему в параметре onscriptload, который затем переводится в ресурсы, загружаемые асинхронно, а затем предоставляемые для вашего модуля.

+0

Работает как очарование - спасибо! Я использовал эту технику для создания небольшой обертки AMD для API Bing, которую я мог бы затем экспортировать в другие модули. – killthrush

+0

Как вы справляетесь с ситуациями, когда тайм-аут mapcontrol. Похоже, что он блокирует загрузку всей страницы во время ее перерыва. – Abadaba

+0

@Abadaba: На самом деле это не проблема, связанная с RequireJS, а проблема с использованием сторонних скриптов вообще. Поскольку MS имеет некоторые довольно строгие ограничения на то, как вы можете использовать их код, я даже не думаю, что вы можете кэшировать скрипты локально, поэтому я не знаю, что есть * хорошее * решение. – FtDRbwLXw6

1

При просмотре документации о RequireJS, я увидел эту строку:

Не смешивать CDN загрузку с прокладкой конфигурации в сборке. Пример сценария: вы загружаете jQuery из CDN, но используете конфигурацию shim, чтобы загрузить что-то , как запасная версия Backbone, которая зависит от jQuery. Когда вы делаете сборку, обязательно встраивайте jQuery во встроенный файл и не загружайте с CDN. В противном случае Backbone будет встроен в встроенный файл , и он будет выполняться до загрузки загруженного CDNQ jQuery. Это , потому что конфигурация прокладки просто задерживает загрузку файлов до загрузки зависимостей, но не делает автоматическую упаковку определения. После сборки зависимости уже встроены, конфигурация shim не может отсрочить выполнение кода non-define() 'd до конца. Модули define() 'd работают с загруженным кодом CDN после сборки, потому что они должным образом обертывают свой источник в определении заводской функции, которая будет не выполняться до загрузки зависимостей. Итак, урок: shim config - это показатель зазора для немодульного кода, устаревший код. define() 'd лучше.

См: http://requirejs.org/docs/api.html#config

Microsoft загружается несколько элементов с первой ссылкой сценария (deffered загрузки), вы должны четко избежать его использования другого способа через прокладку, как это больше похоже на погрузочном случае CDN.

+0

мы застряли с включением его в голову как тег сценария, чем? – Abadaba

Смежные вопросы