视图模型我们检查setter中的相等性,还是只检查set&;始终通知

本文关键字:检查 set amp 通知 setter 我们 模型 视图 | 更新日期: 2023-09-27 17:59:43

我没能找到关于这个主题的讨论,但我认为它非常重要,所以它存在的可能性很大,所以我很乐意阅读。

在我们的属性视图模型设置器中,我们可以检查提供的值是否等于当前值,并且只在这种情况下通知,或者我们可以忽略检查并设置&立即通知。

虽然此检查看起来很令人高兴,因为它在虚拟机上的"刷新"不会导致视图重绘时节省了一些资源,但当视图稍微复杂一些,并且有一些代码无法放入虚拟机中,或者将其放入虚拟机与将其留在视图中相比太难时,它也会产生一些不良影响。

因此,从我使用MVVM的经验来看,我通常可以想到这种检查阻止某些代码按预期工作的情况。因此,目前我认为这张支票是一件危险的事情,有时通常不值得进行储蓄重划。

此外,有时这种检查可以用作更好的程序逻辑的替代品,例如,当虚拟机上有两个属性实际上是紧密连接的,比如字符串&某个实体的对象表示。因此,当一个被设置为例如字符串时,如果验证正确,它内部也会调用对象设置器,并且这种相等性检查可以避免对象的无限循环<->字符串setter,但在这种情况下,我认为引入一个在setter中检查的标志要好得多,如果不需要,当调用say对象setter来自对字符串setter的调用时,该标志不会调用另一个。

我认为这个检查主要用于我刚才描述的场景,我认为这并不是执行检查的好理由。

那么,我们应该如何对我们的setter进行编码呢?

编辑:好吧,只是给出一个场景,最简单、最愚蠢的场景是:如果我们从VM到View有一个单向绑定,并且由于某种原因,View代码绑定中存在一些直接更改View的处理程序,导致它与VM不同步,那么刷新VM不会有帮助。当然,很明显,在这种情况下,我们应该调用绑定的VM setter,但我认为在某些情况下,当解析变得不那么透明时,场景可能会更加复杂和高级。所以这种情况是愚蠢的,但进行检查会妨碍正确的行为。我会更多地思考一个现实世界中的例子,这个例子不太容易解决,但可能需要一些时间。。

视图模型我们检查setter中的相等性,还是只检查set&;始终通知

根据我的个人经验,我发现这种检查非常有用,我总是在setter中进行相等检查,以确保如果不需要刷新绑定值,那么我不应该调用属性更改,也不应该在根本不需要时强制视图刷新值。

谈到平等检查给你带来麻烦的场景,我认为场景中一定有一些奇怪的东西,或者很可能你处理的东西不正确,否则我已经使用了很多MVVM,在我的情况下还没有发现这样的场景。即使存在不进行平等检查的情况,我也不会因为在某些情况下遇到的一个小问题而停止使用平等检查。我将尝试在特定的有问题的情况下做一些变通方法来避免问题,而不是在setters 中不使用相等性检查

一般来说,检查是个好主意,尤其是当您在值更改时触发某个事件时,它可以防止您做一些不需要甚至不需要的工作。我不明白为什么在值相同的情况下要触发事件。如果你想,那么最好手动启动它,然后做一些别人可能想不到的事情。