FineUI 官方论坛
标题:
【非BUG,这个问题有意思】Grid里的NumberBox数值有问题!
[打印本页]
作者:
KK.Leung
时间:
2017-7-4 10:21
标题:
【非BUG,这个问题有意思】Grid里的NumberBox数值有问题!
[attach]10333[/attach]当输入59时,按回车,很正常
[attach]10334[/attach]
当再次输入60时,这时还没按回车
[attach]10335[/attach]
当按回车时,60却变成60.0001了
@(F.Window()
.Width(350)
.WindowPosition(WindowPosition.GoldenSection)
.EnableClose(false)
.IsModal(false)
.IsViewPort(true)
.Title("测试")
.ID("Window1")
.Items(
F.Grid()
.Title("BugTest")
.ID("BugTest")
.Height(500)
.Width(500)
.Listener("dataload", "onCreatRow")
.AllowCellEditing(true)
.ClicksToEdit(1)
.Columns(
F.RenderField()
.ColumnID("Price")
.HeaderText("单价")
.HeaderTextAlign(TextAlign.Center)
.Width(90)
.Editor(
F.NumberBox()
.NoDecimal(false)
.NoNegative(true)
//.EnableRound(true)
.DecimalPrecision(4)
.ShowTrigger(false)
.Required(true)
),
F.RenderField()
.ColumnID("TaxPrice")
.HeaderText("含税单价")
.HeaderTextAlign(TextAlign.Center)
.Width(90)
.Editor(
F.NumberBox()
.NoDecimal(false)
.NoNegative(true)
//.EnableRound(true)
.DecimalPrecision(4)
.ShowTrigger(false)
.Required(true)
)
)
.Listener("afteredit", "onCalculate")
)
)
复制代码
<script>
function onCreatRow() {
var records = [];
for (var i = 0; i < 10; i++) {
records.push({
//'': ''
});
}
// 此过程禁止触发事件,防止 dataload 事件死循环
F.noEvent(function () {
F.ui.BugTest.addNewRecords(records, true);
});
}
function onCalculate(event, value, params) {
var me = this, columnId = params.columnId, rowId = params.rowId;
var Price = me.getCellValue(rowId, 'Price');
var TaxPrice = me.getCellValue(rowId, 'TaxPrice');
if (columnId === 'Price') {
TaxPrice = Price * (1 + 10 / 100);
me.updateCellValue(rowId, 'TaxPrice', TaxPrice.toFixed(4));
}
if (columnId === 'TaxPrice') {
Price = TaxPrice / (1 + 10 / 100);
me.updateCellValue(rowId, 'Price', Price.toFixed(4));
}
}
</script>
复制代码
作者:
KK.Leung
时间:
2017-7-4 10:30
后来我在Js中加了标志
function onCalculate(event, value, params) {
var me = this, columnId = params.columnId, rowId = params.rowId;
var Price = me.getCellValue(rowId, 'Price');
var TaxPrice = me.getCellValue(rowId, 'TaxPrice');
if (columnId === 'Price') {
TaxPrice = Price * (1 + 10 / 100);
me.updateCellValue(rowId, 'TaxPrice', TaxPrice.toFixed(4));
console.log("This is Price");
}
if (columnId === 'TaxPrice') {
Price = TaxPrice / (1 + 10 / 100);
me.updateCellValue(rowId, 'Price', Price.toFixed(4));
console.log("This is TaxPrice");
}
}
复制代码
[attach]10336[/attach]
却发现afteredit,这个事件,会触发三次
作者:
sanshi
时间:
2017-7-4 10:32
请上传完整空项目工程,或者发到:
2877408506@qq.com
作者:
sanshi
时间:
2017-7-4 11:11
首先确认一点,这个不是 FineUIMvc 的BUG,而是自己注册的 .Listener("afteredit", "onCalculate") 中处理的问题。
这个地方有点意思,我们来分析一下:
1. 在【含税单价】中输入数字 60,然后失去焦点,会触发 afteredit 事件:
[attach]10337[/attach]
2. 在 afteredit 中,判断 columnId == TaxPrice,会调用 updateCellValue 更新【单价】单元格的值:
[attach]10338[/attach]
3. 这是问题来了,调用updateCellValue 时同样会触发 afteredit 事件,此时 columnId == Price,此时计算的结果是 6.0001:
[attach]10339[/attach]
4. 由于【含税单价】值从 60 改为了 60.0001,所以会再次触发 afteredit 事件,只不过此时计算的【单价】和之前相同,所以不会再次触发 afteredit 事件了。
在整个过程中,修改一次 【含税单价】,其实 afteredit 事件触发了 3 次!!这应该是之前没想到的吧。如果每次改变的值都不同,这将会是一个死循环。
解决办法也很简单,用 F.noEvent 将对 updateCellValue 的调用包含起来:
function onCalculate(event, value, params) {
var me = this, columnId = params.columnId, rowId = params.rowId;
var Price = me.getCellValue(rowId, 'Price');
var TaxPrice = me.getCellValue(rowId, 'TaxPrice');
if (columnId === 'Price') {
TaxPrice = Price * (1 + 10 / 100);
F.noEvent(function () {
me.updateCellValue(rowId, 'TaxPrice', TaxPrice.toFixed(4));
console.log("This is Price");
});
}
if (columnId === 'TaxPrice') {
Price = TaxPrice / (1 + 10 / 100);
F.noEvent(function () {
me.updateCellValue(rowId, 'Price', Price.toFixed(4));
console.log("This is TaxPrice");
});
}
}
复制代码
其实,官网示例已经有现成了例子:
http://fineui.com/demo_mvc#/demo ... /UpdateCellValueTax
作者:
KK.Leung
时间:
2017-7-4 11:16
原来如此,感谢30大大的帮助~
欢迎光临 FineUI 官方论坛 (https://fineui.com/bbs/)
Powered by Discuz! X3.4