我一直在阅读有关 MVVM 模式的信息。View
应该观察变化ViewModel
并相应地采取行动,但是如果View
在 MVVM 架构中可以使用以下代码,我会感到困惑。
fun onClick(view:View){
showUser(viewModel.getUserDisplayName())
}
这里View
不是观察变化,而是从ViewModel
. 这在 MVVM 中被认为是正确的吗?
我一直在阅读有关 MVVM 模式的信息。View
应该观察变化ViewModel
并相应地采取行动,但是如果View
在 MVVM 架构中可以使用以下代码,我会感到困惑。
fun onClick(view:View){
showUser(viewModel.getUserDisplayName())
}
这里View
不是观察变化,而是从ViewModel
. 这在 MVVM 中被认为是正确的吗?
这是一个可能没有一个答案的问题,因为可能会根据具体的用例提出不同的观点。然而:
在我看来,Codesalot 爵士(出色的手柄)在技术上是正确的。让我详细说明。
在 MVVM 中,视图应该将 UI 交互事件(命令)传递给 ViewModel。这里有一篇来自 microsoft(谁发明了 mvvm)的文章:https ://msdn.microsoft.com/en-us/library/ff798384.aspx 这里的例子和 android 无关,但是概念应该是一样的,尤其是如果你看第一张图。
ViewModel 应该发挥它的魔力,通过相应地操作数据来对这些事件做出反应,然后通知观察者(通常是视图)状态变化。然后视图对状态变化做出反应。
这样,如果您只是从 ViewModel 传回数据(以同步方式),那么您的视图可能会丢失副作用。在您的特定示例中,可能没有,但请考虑您调用的方法不仅返回数据,还会更改一些内部状态(例如,计算数据被访问的次数)。那么你的视图就不会知道这些了。
当然,您可以提出这样的情况,即您可以返回视图的所有相关数据,但这开始打破单一责任原则。
这是一篇有趣的博客文章,它可能会给出一个更好的例子,为什么视图应该总是在 ViewModel 之后获取状态:https ://medium.com/upday-devs/mvvm-rxjava-learnings-1819423f9592
对于另一种情况,关于 MVVM 的维基百科文章https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel指出,ViewModel 可以公开公共属性。
所以最后,如果你不直接返回数据,它很可能会更干净。但是,您是架构师,并且您最了解您的应用程序,并且在某些情况下可能会破坏模式。毕竟它们是指导方针。如果您知道为什么要破坏它(并可能记录它),那么一切都应该解决。