Scala Play: как интегрировать и запускать компоненты Angular 7 из вида? - PullRequest
0 голосов
/ 08 июня 2019

Я работаю над проектами Scala 2.12.x Play 2.7.x и Silhouette ~ v6.x.Я также рассматривал Scala-Play-Angular-Seed в качестве отправной точки для того, чего я хотел бы достичь - интеграции компонентов Angular 7 из представлений Play.

Я бы хотел архитектуру, в которой основной моделью MVC являются Play 2.7.x и Silhouette (auth *), а затем в некоторых представлениях Play есть точки входа для компонентов Angular 7 TS, которые работают против Play REST API.фоны. Scala-Play-Angular-Seed достаточно хорош для интеграции сборки и тестирования внешнего интерфейса в изоляции.Идея состоит в том, чтобы простые пользовательские сценарии использования были покрыты Play, а более сложные пользовательские интерфейсы реализованы с использованием подобных приложений Angular 7, запускаемых из представлений Play.

Первая проблема, которую я обнаружил, - это обработка ресурсов.и маршруты.Мое приложение, основанное на Play-Silhouette-Seed , в котором используется подход AssetsFinder т.е.

In 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
  }
}

Как правильно заменить в Scala-Play-Angular-Seed Assets с подходом AssetsFinder?

Во-вторых, они делегируют весь просмотр Angular 7 index.html.Как мне изменить вид Play, чтобы разрешить определенные компоненты Angular 7 (не полный вид) из представлений Play?

...