view 在 MVVM 中向 ViewModel 请求数据是否可以?

Is it ok for view to ask for data from ViewModel in MVVM?

我一直在阅读有关 MVVM 模式的内容。 View 应该观察 ViewModel 中的变化并据此采取行动,但如果 View 中的以下代码在 MVVM 体系结构中正常,我会感到困惑。

fun onClick(view:View){
    showUser(viewModel.getUserDisplayName())
}

这里 View 不是观察变化,而是要求 ViewModel 的最新数据。这在 MVVM 中是否正确?

这是一个可能没有唯一答案的问题,因为可能会根据具体的用例提出不同的观点。然而:

我认为 Codesalot 爵士(出色的处理能力)在技术上是正确的。让我详细说明。

在 MVVM 中,视图应将 UI 交互事件(命令)传递给 ViewModel。 这是微软(mvvm 的发明者)的一篇文章:https://msdn.microsoft.com/en-us/library/ff798384.aspx 这里的示例与 android 无关,但概念应该相同,尤其是如果您查看第一张图。

ViewModel 应该发挥它的魔力,通过相应地操作数据来对这些事件做出反应,然后将状态更改通知观察者(通常是视图)。然后视图对状态变化做出反应。

这样,如果您只是将数据从 ViewModel 传回(以同步方式),那么您的视图可能会缺少副作用。在您的特定示例中,可能没有任何内容,但请考虑您调用的方法不仅 return 数据,而且还会更改某些内部状态(例如,计算访问数据的次数)。那么你的view就不会知道这些了。

当然,您可以证明您可以return 视图的所有相关数据,但这开始打破单一责任原则。

这是一个有趣的博客 post,它可能会给出一个更好的例子,为什么视图应该总是在 ViewModel 之后获取状态:https://medium.com/upday-devs/mvvm-rxjava-learnings-1819423f9592

关于另一种情况,关于 MVVM https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel 的维基百科文章指出,ViewModel 可以公开 public 属性。

所以最后,如果您不直接 return 数据,很可能会更干净。但是,您是架构师,您最了解您的应用程序,并且在某些情况下可能会打破模式。毕竟它们是指南。如果您知道为什么要破坏它(并可能记录下来),那么一切都会顺利进行。