Шаблон Twirl для фреймворка, сравнивающий элемент JavaScript и переменную scala

Как показано в примере кода ниже, я хочу сравнить элемент javascript внутри вспомогательного элемента scala. Однако он всегда возвращает false, даже если присутствует элемент "abcde". Как я могу получить значение javascript внутри вспомогательного элемента scala, кроме использования тегов?

@(appSeq:Seq(String))
<script>
var app = 'abcde'
@if(appSeq.contains(<script>app</script>)) {
   alert('true');
} else {
   alert('false');
}
</script>

2 ответа

Решение

Это невозможно по этой причине:

  • var app = 'abcde' оценивается в JS VM
  • XML-литерал <script>app</script>) оценивается в Java VM

Так как они представляют собой два разных контекста, вы не можете использовать переменную из JS в Scala. Что вы можете сделать, это передать переменную из Scala в JS, так как код Scala оценивается первым, и все значения будут отображаться в шаблоне.

Вам нужен либо жесткий код 'abcde' в XML Scala или, лучше, присвойте ему значение Scala, например:

@(appSeq:Seq(String))
@app="abcde"
<script>
var app = "@app"
@if(appSeq.contains(<script>$app</script>)) {
   alert('true');
} else {
   alert('false');
}
</script>

Ваш вопрос не очень понятен, но использование переменной javascript в scala невозможно. Представление компилируется, и затем вы передаете некоторые переменные этому представлению, в результате play / twirl отображает его как http-ответ. После этого вы попадаете в зону переднего конца, там нет никакой скалы.

Так что лучше перенести свою логику во внешний интерфейс. Если вы хотите содержать проверки только один раз, вы можете выполнить это следующим образом;

@(appSeq:Seq[String], app: String)
<script>
var app = "@app"

@if(appSeq.contains(s"<script>$app</script>")) {
alert('true');
} else {
alert('false');
}
</script>

Но если вы хотите сделать это, проверьте снова снова в переднем конце. Лучше пройти appSeq как массив javascript в интерфейс и сделать javascript, содержащийся на объекте javascript.

Вот ссылка для объяснения содержимого для массива в js.

Другие вопросы по тегам