Загрузка относительного шаблонаUrl
Я пытаюсь найти лучший способ создания модульного масштабируемого приложения angular. Мне очень нравится структура проектов, таких как angular -boilerplate, angular-app, где все связанные файлы сгруппированы вместе с помощью функции для частичных и директив.
project
|-- partial
| |-- partial.js
| |-- partial.html
| |-- partial.css
| |-- partial.spec.js
Однако во всех этих примерах URL-адрес шаблона загружается относительно базового url, а не относительно текущего файла:
angular.module('account', [])
.config(function($stateProvider) {
$stateProvider.state('account', {
url: '/account',
templateUrl: 'main/account/account.tpl.html', // this is not very modular
controller: 'AccountCtrl',
});
})
Это не очень модульное устройство, и его трудно поддерживать в крупных проектах. Мне не нужно было менять путь templateUrl
каждый раз, когда я перемещаю любой из этих модулей. Было бы неплохо, если бы был какой-то способ загрузить шаблон относительно текущего файла, например:
templateUrl: './account.tpl.html'
Есть ли способ сделать что-то подобное в angular?
Ответы
Ответ 1
Я думаю, что в конечном итоге вы обнаружите, что сохранение путей относительно файла js будет сложнее, если возможно. Когда придет время для отправки, вы, скорее всего, захотите объединить все ваши файлы javascript в один файл, и в этом случае вам захочется, чтобы шаблоны были относительно базового. Кроме того, если вы извлекаете шаблоны через ajax, который по умолчанию Angular, если вы не предварительно упаковали их в $templateCache, вам определенно захочется относиться к baseUrl, поэтому сервер знает, где их найти ваш js файл уже отправлен в браузер.
Возможно, причина, по которой вам не нравится иметь их относительно baseUrl в разработке, заключается в том, что вы не используете локальный сервер? Если это произойдет, я бы это изменил. Это сделает вашу жизнь намного проще, особенно если вы собираетесь работать с маршрутами. Я бы посмотрел Grunt, у него очень простой сервер, который можно запустить локально, чтобы имитировать производственную настройку под названием Grunt Connect. Вы также можете проверить проект, например Yeoman, который предоставляет предварительно упакованную среду разработки интерфейса с использованием Grunt, поэтому вам не нужно потратьте много времени на настройку. Проект Angular Seed является хорошим примером настройки Grunt для локальной разработки.
Ответ 2
Лучший способ сделать это сейчас - использовать загрузчик модуля, например, браузер, webpack или typescript. Есть и множество других. Поскольку требования могут быть сделаны из относительного местоположения файла и добавленного бонуса за возможность импортировать шаблоны с помощью преобразований или загрузчиков, таких как partialify, вам больше не нужно использовать шаблонные URL-адреса. Просто вставьте шаблон с помощью запроса.
Мой старый ответ по-прежнему доступен ниже:
Я написал сообщение именно на эту тему и рассказал об этом в нашем местном Angular Meetup. Большинство из нас сейчас используют его в производстве.
Это довольно просто, если ваша файловая структура эффективно представлена в ваших модулях. Вот быстрый просмотр решения. Ниже приведена полная ссылка на статью.
var module = angular.module('myApp.things', []);
var all = angular.module('myApp.things.all', [
'myApp.things',
'things.someThing',
'things.someOtherThing',
'things.someOtherOtherThing',
]);
module.paths = {
root: '/path/to/this/thing/',
partials: '/path/to/this/thing/partials/',
sub: '/path/to/this/thing/sub/',
};
module.constant('THINGS_ROOT', module.paths.root);
module.constant('THINGS_PARTIALS', module.paths.partials);
module.constant('THINGS_SUB', module.paths.sub);
module.config(function(stateHelperProvider, THINGS_PARTIALS) {
stateHelperProvider.setNestedState({
name: 'things',
url: '/things',
templateUrl: THINGS_PARTIALS + 'things.html',
});
});
И тогда любые вспомогательные модули или "относительные" модули выглядят следующим образом:
var module = angular.module('things.someThing', ['myApp.things']);
var parent = angular.module('myApp.things');
module.paths = {
root: parent.paths.sub + '/someThing/',
sub: parent.paths.sub + '/someThing/sub/',
partials: parent.paths.sub + '/someThing/module/partials/',
};
module.constant('SOMETHING_ROOT', module.paths.root);
module.constant('SOMETHING_PARTIALS', module.paths.partials);
module.constant('SOMETHING_SUB', module.paths.sub);
module.config(function(stateHelperProvider, SOMETHING_PARTIALS) {
stateHelperProvider.setNestedState({
name: 'things.someThing',
url: "/someThing",
templateUrl: SOMETHING_PARTIALS + 'someThing.html',
});
});
Надеюсь, это поможет!
Полная статья: Относительные модули AngularJS
Ура!
Ответ 3
Я уже много раз переваривал эту проблему. Я использую gulp для упаковки своих шаблонов для производства, но я изо всех сил пытался найти решение, которое я был доволен разработкой.
Вот где я оказался. Ниже приведенный ниже фрагмент позволяет перенаправить любой URL-адрес по своему усмотрению.
angular.module('rm').config(function($httpProvider) {
//this map can be defined however you like
//one option is to loop through script tags and create it automatically
var templateMap = {
"relative.tpl.html":"/full/path/to/relative.tpl.html",
etc...
};
//register an http interceptor to transform your template urls
$httpProvider.interceptors.push(function () {
return {
'request': function (config) {
var url = config.url;
config.url = templateMap[url] || url;
return config;
}
};
});
});
Ответ 4
Currenly можно сделать то, что вы хотите, используя systemJs загрузчик модулей.
import usersTemplate from './users.tpl';
var directive = {
templateUrl: usersTemplate.name
}
Здесь вы можете проверить хороший пример https://github.com/swimlane-contrib/angular1-systemjs-seed
Ответ 5
Я использовал templateUrl: './templateFile.tpl.html
, но что-то обновил, и он сломался. Поэтому я бросил это там.
Я использовал это в моем объекте Gruntfile.js html2js:
html2js: {
/**
* These are the templates from `src/app`.
*/
app: {
options: {
base: '<%= conf.app %>',
rename: function( templateName ) {
return templateName.substr( templateName.lastIndexOf('/') );
}
},
src: [ '<%= conf.app %>/**/{,*/}<%= conf.templatePattern %>' ],
dest: '.tmp/templates/templates-app.js'
}
}
Я знаю, что это может привести к конфликтам, но для меня это проблема меньшая, чем редактирование /path/to/modules/widgets/wigdetName/widgetTemplate.tpl.html
в каждом файле, каждый раз включаю его в другой проект.