Шаблон 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.