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

M-W*_*eEh 4 android mvvm android-architecture android-architecture-components

我一直在阅读有关MVVM模式的内容.View我应该观察相应的变化ViewModel并采取相应的行动,但如果View在MVVM架构中使用了以下代码,我会感到困惑.

fun onClick(view:View){
    showUser(viewModel.getUserDisplayName())
}
Run Code Online (Sandbox Code Playgroud)

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

pes*_*ira 5

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

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

在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可以公开公共属性.

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