Как показать рассчитанные поля на show.gsp?
У меня возникли трудности с вычислением несохраненных полей. Я хотел бы показать свои реальные доменные классы, но у них есть много полей. Итак, давайте рассмотрим следующий класс домена:
class ImportantCalculation {
BigDecimal parameter1
BigDecimal parameter2
BigDecimal parameter3
BigDecimal result1
BigDecimal result2
...
}
Результат1 и результат2 являются вычисляемыми полями, которые зависят от промежуточных результатов вычислений с использованием параметра 1, параметра 2 и параметра 3. Использование вида математической записи (в реальных вычислениях используется много классов и запросов к базе данных):
subresult1=function(parameter1)
subresult2=function(parameter2,parameter3)
result1=function(subresult1,subresult2)
result2=function(parameter1,subresult2)
В create.gsp эти вычисления выполняются в классе Java, который вызывается службой. Эта услуга используется контроллером. И этот контроллер вызывается элементом автозаполнения jQuery внутри файла JavaScript, затем отображается в соответствующих полях:
Calculations.java -> CalculationsService.groovy -> CalculationsController -> calculations.js -> GSP view.
Представление GSP содержит поля для отображения промежуточных результатов.
Было бы легче сохранить эти промежуточные результаты, но, поскольку они могут быть рассчитаны, в этом нет необходимости, но я не могу сделать это с окончательными результатами.
Итак, мне нужно, чтобы эти промежуточные результаты были показаны в представлении show.gsp, а также в представлении edit.gsp. Но я не знаю, как это сделать. Я пытался использовать Ajax и jQuery, но я новичок в этих инструментах.
Пожалуйста, помогите мне.
Заранее спасибо.
1 ответ
В вашем gsp вы можете использовать вызовы ajax к контроллеру, который вычисляет результаты для вас и возвращает как JSON. В вашем gsp у вас будет такой код JavaScript:
$.ajax({
var value = "any value to be passed as param";
url: "${createLink(controller: 'calculations', action: 'calculate')}",
data: {key:value}, //in your controller, look for the parameter "key" in params map
dataType: 'json',
success: function(data) {
if (data) {
//do something with data (the json object rendered by the action 'calculate')
}
}
});
И в вашем контроллере у вас будет действие, вычисляющее результат или получающее результат, уже сохраненный где-то, например:
def calculate() {
def result = calculatorService.doSomething()
render result as JSON
}
Строка с командой "render" - это та, которая отправляет результат обратно вызывающей стороне (функция javascript 'success').