2014-09-28 10 views
0

У меня есть baseUrl в приложении на основе RequireJs, установленном на /angular. Иногда я хотел бы установить путь относительно базы, иногда я хотел бы установить его относительно текущего каталога.Задание относительных путей из `RequireJs`

Я очень новичок в RequireJs и очень смущен.

Это то, что я сейчас:

require([ 
    'require', 
    'angular', 
    'module/draft/draftDisplay'// module that I want relative to baseUrl 
], function(requireLocal, angular) { 

requireLocal('./autoSave'); // Modules that I want relative to current url 
requireLocal('./module'); 

Что создает эту ошибку: Error: Module name "autoSave" has not been loaded yet for context: _

Как я уже говорил раньше, я не могу получить хорошую ручку на то, как RequireJs работ. Некоторые вещи, которые я не понимаю, являются:

1) Когда RequireJs использовать BaseUrl и когда не использует текущий каталог

2) В чем разница между ID модуля и путь к нему?

3) способ предыдущие модули указываются в require([...],.. массиве Влияет ли как последующие будут решены (которые, казалось бы случай, когда я возился)

Если бы вы могли включить эти вещи в вашем ответе, что бы быть очень полезным.

ответ

1

1) When does RequireJs use the baseUrl and when does it use the current directory

Всегда baseUrl, кроме случаев, когда имя модуля предваряется ./ или ../, в этом случае он использует каталог модуля, который требует другого.

2) What's the difference between a module ID and its path?

Путь включает в себя baseUrl. Например. может быть что-то вроде scripts/vendor/angular/angular.js. Идентификатор модуля не включает baseUrl или суффикс, например. для baseUrl: 'scripts', идентификатор модуля выше был бы vendor/angular/angular.

3) Does the way previous modules are specified in the require([...],.. array affect how subsequent ones are resolved (which seemed to be the case when I tinkered)

No.


Ваша ошибка вызвана с помощью синхронной версии require для модулей, которые не загружены. Вместо этого используйте асинхронную версию; что-то вроде:

requireLocal(['./autoSave', './module'], function(autosave, module) { 
    // here autosave and module are loaded 
}); 
// BEWARE: Here neither autosave nor module are loaded 

Но вы уверены, что хотите внутреннего? Из информации, которую вы предоставляете, потянув требования в наружной потребует, вероятно, хватит, т.е.

require(['require','angular','module/draft/draftDisplay','./autoSave','./module'],...) 

Кроме того, импорт называется 'module' имеет особое значение в требуете; он содержит информацию о модуле ; Если вы буквально используете './module', это будет совсем иначе, чем 'module' (первый ищет файл module.js в том же каталоге, что и этот файл, второй предоставляет информацию об этом модуле).

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