实时搜索: mvvm框架有哪些

mvvm框架有哪些

871条评论 4813人喜欢 3315次阅读 594人点赞
...

如何看懂一个简单的MVVM框架?需要哪些基础知识: 作者:子丶言
链接:http://www.zhihu.com/question/30663561/answer/49072838
来源:知乎
著作权归作者所有,转载请联系作者获得授权。

M -> V 的绑定可以通过 ES5的Object.defineProperty方法来实现(ember和avalon都是用该方法实现的),当数据发生变化时会自动调用set方法,获取数据时会自动调用get方法

var user = {},
nameValue = 'Mee';

Object.defineProperty(user, 'name', {
get: function() {
return nameValue;
},
set: function(newValue) {
nameValue = newValue;
},
configurable: true
});

console.log(user.name); // Mee
user.name = 'Mo';
console.log(user.name); // Mo
console.log(nameValue); // Mo

V -> M 的绑定基本上都是通过DOM事件来实现的,比如input的change和keyup事件等,只要写个函数自动监听这些事件并挂钩到相应执行函数上就可以实现了。其实很多时候都是通过解析模版片段,进行相应的事件绑定。

如何构建Android MVVM 应用框架: 概述
说到Android MVVM,相信大家都会想到Google 2015年推出的DataBinding框架。然而两者的概念是不一样的,不能混为一谈。MVVM是一种架构模式,而DataBinding是一个实现数据和UI绑定的框架,是构建MVVM模式的一个工具。
之前看过很多关于Android MVVM的博客,但大多数提到的都是DataBinding的基本用法,很少有文章仔细讲解在Android中是如何通过DataBinding去构建MVVM的应用框架的。View、ViewModel、Model每一层的职责如何?它们之间联系怎样、分工如何、代码应该如何设计?这是我写这篇文章的初衷。
接下来,我们先来看看什么是MVVM,然后再一步一步来设计整个MVVM框架。
MVC、MVP、MVVM
首先,我们先大致了解下Android开发中常见的模式。
MVC
View:XML布局文件。
Model:实体模型(数据的获取、存储、数据状态变化)。
Controllor:对应于Activity,处理数据、业务和UI。
从上面这个结构来看,Android本身的设计还是符合MVC架构的,但是Android中纯粹作为View的XML视图功能太弱,我们大量处理View的逻辑只能写在Activity中,这样Activity就充当了View和Controller两个角色,直接导致Activity中的代码大爆炸。相信大多数Android开发者都遇到过一个Acitivty数以千行的代码情况吧!所以,更贴切的说法是,这个MVC结构最终其实只是一个Model-View(Activity:View&Controller)的结构。
MVP
View: 对应于Activity和XML,负责View的绘制以及与用户的交互。
Model: 依然是实体模型。
Presenter: 负责完成View与Model间的交互和业务逻辑。
前面我们说,Activity充当了View和Controller两个角色,MVP就能很好地解决这个问题,其核心理念是通过一个抽象的View接口(不是真正的View层)将Presenter与真正的View层进行解耦。Persenter持有该View接口,对该接口进行操作,而不是直接操作View层。这样就可以把视图操作和业务逻辑解耦,从而让Activity成为真正的View层。
但MVP也存在一些弊端:
Presenter(以下简称P)层与View(以下简称V)层是通过接口进行交互的,接口粒度不好控制。粒度太小,就会存在大量接口的情况,使代码太过碎版化;粒度太大,解耦效果不好。同时对于UI的输入和数据的变化,需要手动调用V层或者P层相关的接口,相对来说缺乏自动性、监听性。如果数据的变化能自动响应到UI、UI的输入能自动更新到数据,那该多好!
MVP是以UI为驱动的模型,更新UI都需要保证能获取到控件的引用,同时更新UI的时候要考虑当前是否是UI线程,也要考虑Activity的生命周期(是否已经销毁等)。
MVP是以UI和事件为驱动的传统模型,数据都是被动地通过UI控件做展示,但是由于数据的时变性,我们更希望数据能转被动为主动,希望数据能更有活性,由数据来驱动UI。
V层与P层还是有一定的耦合度。一旦V层某个UI元素更改,那么对应的接口就必须得改,数据如何映射到UI上、事件监听接口这些都需要转变,牵一发而动全身。如果这一层也能解耦就更好了。
复杂的业务同时也可能会导致P层太大,代码臃肿的问题依然不能解决。
MVVM
View: 对应于Activity和XML,负责View的绘制以及与用户交互。
Model: 实体模型。
ViewModel: 负责完成View与Model间的交互,负责业务逻辑。
MVVM的目标和思想与MVP类似,利用数据绑定(Data Binding)、依赖属性(Dependency Property)、命令(Command)、路由事件(Routed Event)等新特性,打造了一个更加灵活高效的架构。
数据驱动
在常规的开发模式中,数据变化需要更新UI的时候,需要先获取UI控件的引用,然后再更新UI。获取用户的输入和操作也需要通过UI控件的引用。在MVVM中,这些都是通过数据驱动来自动完成的,数据变化后会自动更新UI,UI的改变也能自动反馈到数据层,数据成为主导因素。这样MVVM层在业务逻辑处理中只要关心数据,不需要直接和UI打交道,在业务处理过程中简单方便很多。
低耦合度
MVVM模式中,数据是独立于UI的。
数据和业务逻辑处于一个独立的ViewModel中,ViewModel只需要关注数据和业务逻辑,不需要和UI或者控件打交道。UI想怎么处理数据都由UI自己决定,ViewModel不涉及任何和UI相关的事,也不持有UI控件的引用。即便是控件改变了(比如:TextView换成EditText),ViewModel也几乎不需要更改任何代码。它非常完美的解耦了View层和ViewModel,解决了上面我们所说的MVP的痛点。
更新UI
在MVVM中,数据发生变化后,我们在工作线程直接修改(在数据是线程安全的情况下)ViewModel的数据即可,不用再考虑要切到主线程更新UI了,这些事情相关框架都帮我们做了。
团队协作
MVVM的分工是非常明显的,由于View和ViewModel之间是松散耦合的:一个是处理业务和数据、一个是专门的UI处理。所以,完全由两个人分工来做,一个做UI(XML和Activity)一个写ViewModel,效率更高。
可复用性
一个ViewModel可以复用到多个View中。同样的一份数据,可以提供给不同的UI去做展示。对于版本迭代中频繁的UI改动,更新或新增一套View即可。如果想在UI上做A/B Testing,那MVVM是你不二选择。
单元测试
有些同学一看到单元测试,可能脑袋都大。是啊,写成一团浆糊的代码怎么可能做单元测试?如果你们以代码太烂无法写单元测试而逃避,那可真是不好的消息了。这时候,你需要MVVM来拯救。
我们前面说过了,ViewModel层做的事是数据处理和业务逻辑,View层中关注的是UI,两者完全没有依赖。不管是UI的单元测试还是业务逻辑的单元测试,都是低耦合的。在MVVM中数据是直接绑定到UI控件上的(部分数据是可以直接反映出UI上的内容),那么我们就可以直接通过修改绑定的数据源来间接做一些Android UI上的测试。
通过上面的简述以及模式的对比,我们可以发现MVVM的优势还是非常明显的。虽然目前Android开发中可能真正在使用MVVM的很少,但是值得我们去做一些探讨和调研。
如何构建MVVM应用框架
如何分工
构建MVVM框架首先要具体了解各个模块的分工。接下来我们来讲解View、ViewModel、Model它们各自的职责所在。
View
View层做的就是和UI相关的工作,我们只在XML、Activity和Fragment写View层的代码,View层不做和业务相关的事,也就是我们在Activity不写业务逻辑和业务数据相关的代码,更新UI通过数据绑定实现,尽量在ViewModel里面做(更新绑定的数据源即可),Activity要做的事就是初始化一些控件(如控件的颜色,添加RecyclerView的分割线),View层可以提供更新UI的接口(但是我们更倾向所有的UI元素都是通过数据来驱动更改UI),View层可以处理事件(但是我们更希望UI事件通过Command来绑定)。简单地说:View层不做任何业务逻辑、不涉及操作数据、不处理数据,UI和数据严格的分开。
ViewModel
ViewModel层做的事情刚好和View层相反,ViewModel只做和业务逻辑和业务数据相关的事,不做任何和UI相关的事情,ViewModel 层不会持有任何控件的引用,更不会在ViewModel中通过UI控件的引用去做更新UI的事情。ViewModel就是专注于业务的逻辑处理,做的事情也都只是对数据的操作(这些数据绑定在相应的控件上会自动去更改UI)。同时DataBinding框架已经支持双向绑定,让我们可以通过双向绑定获取View层反馈给ViewModel层的数据,并对这些数据上进行操作。关于对UI控件事件的处理,我们也希望能把这些事件处理绑定到控件上,并把这些事件的处理统一化,为此我们通过BindingAdapter对一些常用的事件做了封装,把一个个事件封装成一个个Command,对于每个事件我们用一个ReplyCommand去处理就行了,ReplyCommand会把你可能需要的数据带给你,这使得我们在ViewModel层处理事件的时候只需要关心处理数据就行了,具体见MVVM Light Toolkit 使用指南的 Command 部分。再强调一遍:ViewModel 不做和UI相关的事。
Model
Model层最大的特点是被赋予了数据获取的职责,与我们平常Model层只定义实体对象的行为截然不同。实例中,数据的获取、存储、数据状态变化都是Model层的任务。Model包括实体模型(Bean)、Retrofit的Service ,获取网络数据接口,本地存储(增删改查)接口,数据变化监听等。Model提供数据获取接口供ViewModel调用,经数据转换和操作并最终映射绑定到View层某个UI元素的属性上。
如何协作
关于协作,我们先来看下面的一张图:

上图反映了MVVM框架中各个模块的联系和数据流的走向,我们从每个模块一一拆分来看。那么我们重点就是下面的三个协作。
ViewModel与View的协作。
ViewModel与Model的协作。
ViewModel与ViewModel的协作。
ViewModel与View的协作

图2中ViewModel和View是通过绑定的方式连接在一起的,绑定分成两种:一种是数据绑定,一种是命令绑定。数据的绑定DataBinding已经提供好了,简单地定义一些ObservableField就能把数据和控件绑定在一起了(如TextView的text属性),但是DataBinding框架提供的不够全面,比如说如何让一个URL绑定到一个ImageView,让这个ImageView能自动去加载url指定的图片,如何把数据源和布局模板绑定到一个ListView,让ListView可以不需要去写Adapter和ViewHolder相关的东西?这些就需要我们做一些工作和简单的封装。MVVM Light Toolkit 已经帮我们做了一部分的工作,详情可以查看MVVM Light Toolkit 使用指南。关于事件绑定也是一样,MVVM Light Toolkit 做了简单的封装,对于每个事件我们用一个ReplyCommand去处理就行了,ReplyCommand会把可能需要的数据带给你,这样我们处理事件的时候也只关心处理数据就行了。
由图1中ViewModel的模块中我们可以看出ViewModel类下面一般包含下面5个部分:
Context (上下文)
Model (数据源 Java Bean)
Data Field (数据绑定)
Command (命令绑定)
Child ViewModel (子ViewModel)
我们先来看下示例代码,然后再一一讲解5个部分是干嘛用的:
//contextprivate Activity context;//model(数据源 Java Bean)private NewsService.News news;private TopNewsService.News topNews;//数据绑定,绑定到UI的字段(data field)public final ObservableField<String> imageUrl = new ObservableField<>();public final ObservableField<String> html = new ObservableField<>();public final ObservableField<String> title = new ObservableField<>();// 一个变量包含了所有关于View Style 相关的字段public final ViewStyle viewStyle = new ViewStyle();//命令绑定(command)public final ReplyCommand onRefreshCommand = new ReplyCommand<>(() -> {

})public final ReplyCommand<Integer> onLoadMoreCommand = new ReplyCommand<>((itemCount) -> {

});//Child ViewModelpublic final ObservableList<NewItemViewModel> itemViewModel = new ObservableArrayList<>();/** * ViewStyle 关于控件的一些属性和业务数据无关的Style 可以做一个包裹,这样代码比较美观,
ViewModel 页面也不会有太多太杂的字段。 **/public static class ViewStyle {
public final ObservableBoolean isRefreshing = new ObservableBoolean(true);
public final ObservableBoolean progressRefreshing = new ObservableBoolean(true);
}
Context

mvvm框架是什么 它和其他框架的区别:   在MVC里,View是可以直接访问Model的!从而,View里会包含Model信息,不可避免的还要包括一些业务逻辑。 MVC模型关注的是Model的不变,所以,在MVC模型里,Model不依赖于View,但是 View是依赖于Model的。不仅如此,因为有一些业务逻辑在View里实现了,导致要更改View也是比较困难的,至少那些业务逻辑是无法重用的。

  MVVM在概念上是真正将页面与数据逻辑分离的模式,它把数据绑定工作放到一个JS里去实现,而这个JS文件的主要功能是完成数据的绑定,即把model绑定到UI的元素上。

  有人做过测试:使用Angular(MVVM)代替Backbone(MVC)来开发,代码可以减少一半。

  此外,MVVM另一个重要特性,双向绑定。它更方便你同时维护页面上都依赖于某个字段的N个区域,而不用手动更新它们。

现在国内哪些大型网站是用前端mvvm框架开发: 几乎都用到,而且还会不同站点用不同的框架,估计是不同项目组的原因, 百度,淘宝,京东,腾讯网,网易都用到MVVM框架

javascript框架bootstrap和angularjs各有什么作用: bootstrap不算是javascript框架,它只是一个前端的ui框架,然后有一些附带的js插件而已。
angularjs是一个javascript的mvvm的框架,是为了开发有复杂业务逻辑的CRUD应用而生的。

对augularjs vuejs avalon react 这几个框架了解吗: 首先这四个都是 mvvm 的框架。
我只用过 augularjs vuejs ,angularjs 对 ie 的支持不是很好,特别是 ie 11 根本不能用。
angularjs 的话 除1之外的版本,几乎用的都不是 js 了。
现在大部分用 vue 的比较多,也有一些还在用 angularjs。
react 手机端用的多。 avalon 这个一点都不了解。
不过 用过 vue 和 angularjs,我觉得只要会一种,另外的学起来很快。必将相似

angular1.x框架怎么用:

angular作为一个标准的mvvm框架是需要在有一定的JavaScript基础上进行学习才能熟练的使用,学习起来是有一些成本的,因为angular不同于jQuery等传统直接操作dom的框架。

工具原料:编辑器、浏览器

1、使用angular实现最简单的数据双向绑定的helloworld示例代码如下:

<!doctype html><html ng-app>  <head>    <script src="/img/e3t5b3VyTmFtZX19ISZsdDsvaDEmZ3Q7wqDCoMKgwqAmbHQ7L2RpdiZndDvCoMKgJmx0Oy9ib2R5Jmd0OyZsdDsvaHRtbCZndDs8L3A+PHA+MuOAgei/kOihjOeahOe7k+aenOaYr+i+k+WFpeahhueahOWGheWuueWwhuS8muS6i+WunueahOeOsOWunuWcqOmhtemdomhlbGxv55qE5ZCO6Z2i77yM5a6e546w5pWw5o2u55qE5Y+M5ZCR57uR5a6a5pWI5p6c77yM5aaC5LiL5Zu+77yaPC9wPjxwPjxpbWcgc3JjPQ=="https://iknow-pic.cdn.bcebos.com/08f790529822720eb0aaafa570cb0a46f21fab0d?x-bce-process=image/resize,m_lfit,w_600,h_800,limit_1" />

为什么Bootstrap不设计得像Semantic UI那样简洁易懂: bootstrap基于html5css3ui框架ui框架除bootstrapextjs等应用都
非要说比传统手写我要说些偏激我能说:ui框架便前端界面搭建更快捷更便搭建相稳定前端界面缺点由于框架自写所需要框架细节进行修改候要重新习框架
参考些bootstrap模板错除美观具备响应式交互觉错目前我翻译套基于bootstrap框架文档觉挺实用用功能几乎都功能够用考虑使用其插件代替

  • dnf在哪学技能

    办银行信用卡要不要钱: 1.申请办理所有信用卡都是免费的。2.所有信用卡都是有年费的。但是可以免年费的。刷卡次数到达银行免年费的次数。那么第二年开始就不用年费。第二年再刷银行规定的笔数。然后第三年也不用年费(普卡和金卡和小白金卡)3.标准白...

    281条评论 1612人喜欢 6282次阅读 761人点赞
  • 194旅在哪

    本田xrv2019新款车钥匙拧不动试过转把拧钥匙还是不开怎么办?: 这是因为方向盘锁止了,不能用力去拧,只需要在拧钥匙的同时摆动方向盘就可以了。 ...

    826条评论 6531人喜欢 5959次阅读 283人点赞
  • 2016生育险报销几个月

    sony数码相机上的custom是什么意思: custom的意思是定制,习惯等,在SONY的数码相机上表示它可以定制(设定)你的喜好,也可以叫做个性化,根据你的喜欢,可以设置不同的使用参数,以方便你的使用习惯和爱好。 ...

    314条评论 3207人喜欢 1563次阅读 491人点赞
  • 2017年新款车型有哪些

    本田xrv1.8高配豪华版有没有后排空调出风口: 这个高配的车型应该就是没有后排空调出风口的,希望能够对你有所帮助 ...

    739条评论 3595人喜欢 1936次阅读 620人点赞

随机推荐榜单