Как работает Require.JS?
Если вы используете AngularJS, то RequrieJS вам не нужен вообще никогда.
1) Если вы делаете жирного клиента (т.е. все скрипты минифицируете в один-два файла, например: components.js (в котором AngularJS, LoDash.js и прочие библиотеки/плагины), application.js (собственно, ваша аппликация: контроллеры, директивы и прочее) и templates.js (все ХТМЛ-шаблоны для директив и страничек)), то вам RequireJS не нужен вообще — он просто бесполезен, так как асинхронно подгружать модули вам больше не нужно, ведь у вас и так всё есть, а Dependency Injection уже есть в Ангуларе из коробки.
2) Если же вы используете Ангулар и для Dependency Injection хотите использовать еще и RequireJS, то это, конечно же, бред, не делайте так — в Ангуларе всё уже есть для DI.
3) Если же вам нужна асинхронная подгрузка модулей, то используйте именно асинхронный загрузчик, без функционала DI (например, https://github.com/ded/script.js, да тысячи их) + Ангуларовский angular-loader.js, который позволяет загружать ангуларовские модули в любом порядке.
Загрузка модулей и DI — абсолютно разные вещи. Грубо говоря (очень грубо), загрузка модулей отвечает за работу с файлами, а DI — за создание сущностей. require.js загружает файл с вашим контроллером, чтобы он вообще появился в вашем приложении, а ангуляровский DI отвечает за то, чтобы он получил нужные ему для работы сущности. 
Что делает require.js: согласно конфигу и настройкам выясняет путь к файлу, отвечающему за данный модуль, создает, при необходимости, узел script с src равным этому пути, и дожидается, когда этот скрипт загрузится.