2016-09-10 1 views
0

Мой GSP файл (в Grails 3.1.10):Как применять GString интерполяции в файле JS в Grails

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
    <asset:javascript src="jquery-2.2.0.min.js"/> 
    <asset:javascript src="myfile.js"/> 
</head> 
<body> 
    <span id="greeting"></span> 

</body> 
</html> 

myfile.js:

greeting = "${resp}"; // resp is passed from controller 
$(document).ready(function(){ 
    $('#greeting').val(greeting); 
}); 

Ну, я считаю, что каждый разработчик grails знает, могу ли я переместить myfile.js в свой файл GSP, он будет работать.

Однако я надеюсь узнать, как позволить автономному js-файлу правильно обрабатывать встроенную переменную GString.

Спасибо.

ответ

2

Ниже приведен подход, за которым я последовал, столкнувшись с такой же проблемой, как ваша.

Передайте переменную GString на внешний JS следующим образом.

Добавьте ниже функцию во внешнем JS

function view_handler_function(greetingValue){ 

    //assign the value to your element 
    $('#greeting').val(greetingValue); 

    ..... 
    //Your other handling code 
} 

Вызов вашей функции от вашей точки зрения

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
    <asset:javascript src="jquery-2.2.0.min.js"/> 
    <asset:javascript src="myfile.js"/> 
</head> 
<body> 
    <span id="greeting"></span> 

    <script> 
     var greeting = "${resp}"; // resp is passed from controller 
     $(document).ready(function(){ 

      //call to your external function 
      view_handler_function(greeting); 
     }); 
    </script> 
</body> 
</html> 

Примечание: Это может или не может быть точный ответ, который вы ищете, но только одним путем я следую.

+0

ну, в основном, ваш путь такой же, как у норганов (вверху). Что делать, если у меня много переменных? это все еще ваш предложенный способ? – wureka

+0

Да. Вы можете создать карту своих переменных (если их больше 5), а затем отправить ее на внешнюю функцию JS. –

1

Это невозможно, и это не очень хорошая идея (хотя, конечно, вы можете использовать действие контроллера как javascript src и в этом действии, прочитанном в js-файле, и запускать его контент через, например, simpleTemplateEngine)

с js-файлами, которые будут интерпретироваться как gstrings/other templates, будет означать, что любое кэширование (файлы пакетов через конвейер ресурсов, дистрибутив cdn и кеширование браузера) должно быть отключено.

Однако вы можете просто ставить файлы js статически и, например, предоставите свой динамический ввод в качестве глобальных переменных в встроенном javascript (например, из вашего макета):

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Title</title> 
</head> 
<body> 
    <span id="greeting"></span> 
    <g:javascript> 
     var greeting = "${resp}"; 
    </g:javascript> 
    <asset:javascript src="jquery-2.2.0.min.js"/> 
    <asset:javascript src="myfile.js"/> 
</body> 
</html> 
+0

#norganos, что, если у меня много переменных (например: 20 ~ 30)? Это все еще ваш предложенный способ? – wureka

+0

yes (вероятно, пока кто-то не придумает лучшую идею), я использую этот вид шаблона в двух проектах, каждый из которых имеет около 15-20 vars, которые должны быть установлены динамически, завернутые в глобальный объект. вы могли бы, конечно, избегать глобальных переменных, используя функции init. – norganos

Смежные вопросы