2014-11-04 3 views
4

У меня есть куча модулей, определенных в приложении Ember CLI, и каждый начинается с того же пути. Я хотел бы импортировать модули в модуль в приложении. Например, я мог бы написать:Импорт динамического модуля в Ember CLI

import post1 from 'posts/1'; 
import post2 from 'posts/2'; 
import post3 from 'posts/3'; 

export default Em.ObjectController.extend({ 
    posts: Em.A(post1, post2, post3), 
}); 

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

Есть ли способ импортировать все модули, которые начинаются с определенного пути? Например, как я могу сделать что-то вроде следующего:

import posts from 'posts/*'; 

// or 

registry['posts'].forEach(postId, i) { 
    var path = 'posts/' + postId; 

    import i from path; 
} 

Каждый из модулей, которые я хочу, чтобы найти и импортировать экспортировал объект.

Я прошел через документы ES6 module transpiler, но не могу найти много.

+0

Что вы подразумеваете под 'precompiler' ?? emcom-cli precompiler ??? – thecodejack

+0

«Прекомпилятор» означает прекомпилятор шаблона, написанный как адронный аддон, который манипулирует деревом и добавляет объекты javascript в качестве модулей ES6 для определенных расширений файлов. –

ответ

5

Спецификация ES6 не позволяет динамически импортировать модули с использованием ключевого слова import. Все импорт и экспорт с использованием синтаксиса модуля должны выполняться статически. Однако он предоставляет программный API, который можно использовать для динамического импорта модулей. This article имеет большое резюме (а также отличное резюме остальных модулей ES6).

Мое предложение - обернуть API-интерфейс загрузчика Ember в совместимую с ES6 оболочку. Например, Эмбер-CLI использует функцию require(), чтобы получить модули, так что вы могли бы сделать что-то вроде этого:

window.System = window.System || {}; 
window.System['import'] = function(moduleName) { 
    return Ember.RSVP.Promise.resolve(window.require(moduleName)); 
} 

// ... 

System.import('my-app/posts/' + postNumber).then(function(postModule) { 
    // ... 
}); 

Вы можете также использовать функцию Ember require() непосредственно, мой путь только защищает вас в вероятном случае, что Ember изменяет их загрузчик модулей.

+0

Спасибо за ответ, но так или иначе, чтобы узнать, какие доступные модули для импорта? В вашем примере я не знаю, какие возможные варианты для 'postNumber'. –

+1

Я ответил на свой вопрос: 'for (var module in window.require.entries) {}'. –