【问题标题】:grails: sum selected valuesgrails:对选定值求和
【发布时间】:2013-05-17 09:45:21
【问题描述】:

我在 Grails 中有如下选择

<g:select name="receiptItems" from="${myGrailsProject.ReceiptItem.list()}" multiple="multiple" optionKey="id" optionValue="description" size="5" value="${receiptInstance?.receiptItems*.id}" class="many-to-many"/>

ReceiptItem 对象有一个数字字段(金额)。我需要对所选值的金额字段求和并将其放在另一个文本字段中。 特别是,当我选择一个新值时,我需要将其添加到“totalAmount”,反之亦然,当我取消选择一个值时,我需要从“totalAmount”中删除该值。 我如何了解该项目是被选中还是未选中?如何在 Controller 类中执行计算,然后在 javascript 中使用新值更新文本字段? 感谢您的帮助

【问题讨论】:

  • 这真的与 Grails 无关,与 JQuery/JavaScript 有关。
  • 也许是的,但不只是JQuery/Javascript,因为我想知道有没有办法在Controller中进行计算,然后调用Javascript来更新字段...我希望它很清楚...无论如何感谢您的评论!

标签: grails select sum selected


【解决方案1】:

您可以使用 jquery 来做到这一点。例如,您的选择是

<select id="mySelect" multiple="multiple">
  <option value="1">First</option>
  <option value="2">Second</option>
  <option value="3">Third</option>
  <option value="4">Fourth</option>
</select>

监听变化事件:

$('#mySelect').change(function() {
     var amount = 0;

     $('#mySelect option').each(function() {
            if($(this).is(':selected'))
                  amount += $(this).val(); 
      });

     $('#amount').val(amount);

 });

希望这会有所帮助。

【讨论】:

  • 谢谢!我在选择中使用了带有 onChange 参数的 remoteFunction 来监听变化的事件。它允许调用控制器的动作。我需要在控制器中进行计算,然后使用 onSuccess 参数调用更新值的 javascript 代码...你知道该怎么做吗?
  • 在您的要求中,您遇到了问题?如果这是在 onSuccess 中,您可以从控制器中获取返回值,并从金额字段中的值中加/减。从控制器,您可以发送两个参数:一个用于值,另一个用于类型:加/减;然后在 onSuccess 中,根据 type(add/deduct) 值,使用现有值添加/删除返回值。喜欢加法: $('#amount').val($('#amount').val()+returnedValue);
  • 我不明白你在问我什么...我想知道控制器中是否有办法进行计算,然后在计算完成后调用更新场...我希望问题现在很清楚。感谢您的帮助
  • 我已经测试了你的代码。有用。问题是我的选择中的值不是我需要求和的值,因为在值参数中我有相关元素的 id,而不是要求和的值。因此,我需要获取元素的值(即 Grails 中域类的实例)。我该怎么做?
  • 如果你需要值,即显示的选项文本,你需要使用:amount += $(this).text();在我的示例中,您将获得 First、Second 等..
【解决方案2】:

好的,所以您有一个对象 ID 列表,您需要对该域的一个字段求​​和并将总和返回给 javascript?如果是这样:

JavaScript:

$('#mySelect').change(function() {
    var $this = $(this);
    $.ajax({
      type: 'POST',
      url: enterYourPathHere,
      data: {values: $this.val()},
      dataType: 'json',
      success: function(data) {
       //Populate your totalAmount field with data.amount
      },
      error: function(jqXHR, textStatus, errorThrown) {
       //Handle any errors
      }
});

控制器:

Float totalAmount = Object.findByIdInList(params.list("values"))?.amount?.sum() ?: 0

render [amount: totalAmount] as JSON

显然为您的域、字段等更改此设置...

【讨论】:

  • 抱歉,您的代码中有一些我不明白的地方。考虑我的域类名为 Receipt,它有一个字段如下: static hasMany = [receiptItems:ReceiptItem] 每个 ReceiptItem 都有一个名为“amount”的字段。那么,我该如何解决这个问题呢?我已经尝试在控制器中遵循您的示例,但我的域类没有 findbyidinlist 方法。非常感谢,并为我糟糕的编码技巧感到抱歉:)
  • 更正。 findbyidinlist 存在但 sum 方法不... findByIdInList 只返回一个值,对吗?如何获取所有金额值来执行求和?
  • 我很抱歉-应该是findAllByIdInList
  • 完美...现在我的问题是:如何在jquery方法中调用控制器?在url中我需要放置控制器路径吗?
  • 其他我不明白的事情:数据:{values: $this.val()} 告诉我有一个名为 values 的参数,但它包含什么?选择的值或所有值在选择的那一刻被选中?如果答案是第一个,如果我取消选择一个值,如何从金额中删除一个值?感谢帮助!
猜你喜欢
  • 1970-01-01
  • 2013-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
  • 2017-08-05
相关资源
最近更新 更多