对于Play Framework和AngularJs的应用程序,我有以下文件:
app/views/index.scala.html
app/assets/app/app.js
app/assets/app/app.scss
app/assets/app/main/_main.scss
app/assets/app/main/main.controller.js
app/assets/app/main/main.html
app/assets/app/main/main.js
app/assets/components/navbar/navbar.controller.js
app/assets/components/navbar/navbar.directive.js
app/assets/components/navbar/navbar.html
scss
个文件位于app/assets
,因此sbt-sassify
插件会将它们编译为css
。其他观点(js
和html
文件)也位于app/assets
,但我可以将其移至公开。
conf/routes
包含:
GET /assets/*file controllers.Assets.versioned(path="/public", file: Asset)
navbar.directive.js
如下:
angular.module('quotesApp')
.directive('navbar', () => ({
templateUrl: 'components/navbar/navbar.html',
restrict: 'E',
controller: 'NavbarController',
controllerAs: 'nav'
}));
这不起作用,因为templateUrl components/navbar/navbar.html
路径需要以/assets/
为前缀,如conf/routes
文件中所定义。
那么,解决这个问题的正确形式是什么?
我是否应该在文件/assets
中对前缀navbar.directive.js
进行硬编码,如下所示?但是,在更改路径定义时会出现这种情况。
angular.module('quotesApp')
.directive('navbar', () => ({
templateUrl: '/assets/components/navbar/navbar.html',
restrict: 'E',
controller: 'NavbarController',
controllerAs: 'nav'
}));
我应该创建一个视图app/views/components/navbar/navbar.directive.scala.js
(但这只是使用routes
函数的许多样板文件):
@()
angular.module('quotesApp')
.directive('navbar', () => ({
templateUrl: @routes.Assets.versioned("components/navbar/navbar.html"),
restrict: 'E',
controller: 'NavbarController',
controllerAs: 'nav'
}));
还有其他解决方案吗?也许某种相对路径?
答案 0 :(得分:1)
您可以在角度指令中需要之前在index.scala.html
中定义该路径:
<head>
<!-- Something -->
<script>
window.MyApp = {
'navBarPath': '@routes.Assets.versioned("components/navbar/navbar.html")';
};
</script>
</head>
然后在你的指令中使用:
// (...)
templateUrl: MyApp.navBarPath,
这并不完美,但我认为这是达到你想要的最简单方法。