视图是否可以从MVVM中的ViewModel请求数据?

时间:2018-05-15 06:15:22

标签: android mvvm android-architecture-components android-architecture

我一直在阅读有关MVVM模式的内容。 View应该观察ViewModel中的更改并相应地对其进行操作,但如果在View中跟随代码在MVVM架构中正常,我会感到困惑。

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

这里View没有观察到变化,而是要求ViewModel的最新数据。这在MVVM中被认为是正确的吗?

1 个答案:

答案 0 :(得分:5)

这是一个可能没有人回答的问题,因为根据确切的用例,可能会提出不同的观点。但是:

Codealot爵士(伟大的手柄)在我看来在技术上是正确的。让我详细说明一下。

在MVVM中,视图应将UI交互事件(命令)传递给ViewModel。 以下是微软发表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可以公开公共属性。

所以最后,如果你不直接返回数据,它很可能会更清晰。但是,您是架构师,并且您最了解您的应用程序,并且可能存在可以打破模式的情况。毕竟他们是指导方针。如果你知道为什么要打破它(并且可能记录它),那么一切都应该解决。