我正在研究Scala 2.12.x Play 2.7.x和Silhouette〜v6.x项目。我还一直以Scala-Play-Angular-Seed为起点,希望从Play视图中集成Angular 7组件。
我想要一个主要MVC模型为Play 2.7.x和Silhouette(auth *)的体系结构,然后某些Play视图具有可与Play REST API后端配合使用的Angular 7 TS组件的入口点。 Scala-Play-Angular-Seed非常适合于隔离的构建集成和前端测试。想法是让Play涵盖简单的前端用例,并使用Angular 7来实现更复杂的UI用例,例如从Play视图触发的子应用程序。
我发现的第一个挑战是资产处理和路线。我基于Play-Silhouette-Seed的应用程序,该应用程序使用AssetsFinder
approach,即
在application.conf
中:
# The asset configuration
# ~~~~~
play.assets {
path = "/public"
urlPrefix = "/assets"
}
在routes
中:
# Map static resources from the /public folder to the /assets URL path
GET /assets/*file controllers.Assets.versioned(file)
-> /webjars webjars.Routes
并在控制器中:
class ApplicationController @Inject() (
components: ControllerComponents,
silhouette: Silhouette[DefaultEnv],
authInfoRepository: AuthInfoRepository
)(
implicit
webJarsUtil: WebJarsUtil,
assetsFinder: AssetsFinder,
userService: UserService,
ec: ExecutionContext,
) extends AbstractController(components) with I18nSupport {
但是,Scala-Play-Angular-Seed使用Assets
方法,因此:
在routes
中:
# Serve static assets under public directory
GET /*file controllers.FrontendController.assetOrDefault(file)
,并且在FrontendController
中他们这样做:
@Singleton
class FrontendController @Inject()(assets: Assets, errorHandler: HttpErrorHandler, config: Configuration, cc: ControllerComponents) extends AbstractController(cc) {
def index: Action[AnyContent] = assets.at("index.html")
def assetOrDefault(resource: String): Action[AnyContent] = if (resource.startsWith(config.get[String]("apiPrefix"))){
Action.async(r => errorHandler.onClientError(r, NOT_FOUND, "Not found"))
} else {
if (resource.contains(".")) assets.at(resource) else index
}
}
如何用Assets
方法正确替换Scala-Play-Angular-Seed中的AssetsFinder
?
第二,它们委派给整个Angular 7视图index.html
。我如何更改Play视图以从Play视图中解析特定的Angular 7组件(不是完整视图)?