Scala Play:如何从视图中集成和触发Angular 7组件?

时间:2019-06-08 11:17:54

标签: angular scala playframework angular7 play-framework-2.7

我正在研究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组件(不是完整视图)?

0 个答案:

没有答案