regularjs/regular

关于lazy引发的一个问题

Closed this issue · 9 comments

是这样的。

lazy,是在失焦的时候,会触发,做一次$update,同时会触发$watch。

而我代码中,有针对input的失焦事件,就比如说当input为空时,将它变成0.00,或者输入1.35,结果变成1.4,也需要做一次$update,也会触发$watch。

那么问题来了,能不能将这两个$update合并一下,就是有没有api??

我个人的理解是,把失焦的事件,弄成一个队列。

在lazy失焦后,执行失焦的的事件队列,完了再$update。

但现在我在失焦的事件里面不做$update的话,显示的值和model的值并不一致。

其实,如果更新逻辑是异步的 就没有这个问题, 而且可以带来可观的性能提升。 不过由于目前的设定就是同步更新,所以无法将$update的时机做更改了。

我疑问的是,即使这次$update在你的需求中 是多余的, 引起了别的逻辑问题了么

是的。。在$watch事件中,有一个脚本代码是弹出popup窗体。。

然后因为,我在input里面输入3,然后失焦,然后触发了一次$watch,就会弹出一个popup,随后触发了我写的onblur事件,值会变成3.00,同时$update,又触发了一次$watch,又会弹出一个popup。

导致了界面有两个popup,这样就有问题了。

针对上面的问题,有没有其他的解决途径?

加个flag保存下,如果popup已经弹出来,就不要再弹了?

不太理解为什么你要把弹popup的逻辑放两处,$watch里面一处,onblur又有一处,只放onblur里面会有什么问题么?$watch的方式本来就是比较通用的,它不会管你是onblur触发的还是onchange触发的,不通用的逻辑建议不要放到$watch里面处理

用下面这种方式的话应该也不会出现两个popup

{#if showPopup}
<Popup></Popup>
{/if}

@fengzilong ,没有放两处,就只放了一处,在watch那里。

因为$watch触发了两次,我想的问题是能不能触发一次?听了波神的解释,确实是不行了。

onblur那里,其实是写了一个指令,里面有oninput、onfocus这些事件,因为lazy会导致filter最后才被执行的,所以像实时检测输入的有没有问题(比如说不能输入非数字),就只能通过指令了。

我调用弹窗是自己封装了一个方法,利用RegularUI,加上promise。所以略麻烦了

我理解错了

lazy,是在失焦的时候,会触发,做一次$update,同时会触发$watch。

你这句话让我以为失焦有自己的逻辑,然后$update,又触发了$watch。。。

没看清楚你的需求,你的场景必须用指令?把弹popup逻辑放指令里面可以么(先不管这么写合不合适...)

你说的必须用指令,确实给我一些启发了。

我其实可以把onblur的事件,写到过滤器里面,这样一来,只会触发一次了。。谢谢