VM表单:

VM表单是一种高仿Vue的封装,从Vue的角度来说,比如我们登录页面的vue里面定义了一个params对象,用来收集登录需要用到的参数。

<input placeholder="用户名"   v-model="params.name" />

<input placeholder="密码"   v-model="params.password" />

在vue的内部,只要用户在输入框中输入了值就会实时的被vue放到params中。我们这里和vue如出一辙。


首先所有的表单类属于我们需要特别要关注的对象,所以但他们是来自不同的类,我们需要把这些来自不同的类统一管理(因为他们有很多共性),我们抽取一个VMProtocol协议,用来标识这是一个表单类:

表单类:要么收集数据(vid),要么触发事件(clickEvent)。

protocol VMProtocol {

   var baseActivity: BaseActivity?      //这个组件所属的activity,

    var vid: String = ""  //这个一般是输入框用的

    var clickEvent: String = ""  //这个一般是按钮用的

}

严格来说上面的BaseActivity类型不准确,因为安卓还有tab页面不是activity,之前我们已经用协议统一了,所以这个类型最好是BasePageInterface. 


现在可以开始布局了。输入框按不同的页面填充vid,按钮就填写clickEvent。当页面布局好之后,页面是不是在运行的时候触发onLoad呢。当一会发生点击事件的时候,按钮需要调用到所属页面的js方法。但目前按钮怎么知道当前页面在哪呢,这需要我们写代码来得到。

另外,我们可以不用这么麻烦,点击按钮的时候,手写点击事件,再通过当前页面调用js。这样确实没问题,不过当页面按钮或输入框多的时候你会发现这是一个重复内枯燥的体力活,完全没必要做这个重复的工作。而且应该简洁封装,达到布局完页面功能就好的目的。

再观察下vue的语法,输入框仅仅是绑定了key,按钮仅仅是写了一个事件名,所有功能就对了,就应该这么简洁简单。


我们在BaseActivity的onLoad里面,此时所有的控件均已经加载完成了。我们从BaseActivity根视图中 递归 查询所有的VMProtocol。

特别注意:应该是递归查询,因为子视图的嵌套可能有多层。

细节:

(1)当一个view的子views数组的length=0,说明没有子视图,可以不用递归。

(2)当一个view是按钮,switch,列表等(这里是ios思维)复杂控件也可以不用递归,严格说应该是可能有子view的才递归。

(3)当这个view本身就是VMProtocol,其实也可以不用递归了。因为已经找到了。

从结果上,找到了VMProtocol之后,我们只需要做一件事:

vm.baseActivity = this

或者

vm.basePageInterface = this

比如按钮:未来,当这个按钮发生点击事件,这个button就可以拿到baseActivity,继而就可以调用js这个方法混编了。


一、封装VMTextField, 输入框(多行文本域同理)

class VMTextField: TextField, VMProtocol { //遵守VMProtocol协议

        var basePageInterface: BasePageInterface?      //这个组件所属的activity,

        fun init(){   //控件初始化

            self.addEventLister("inputEvent",{    //自己就在内部监听自己的实时输入事件

                    

                    this.basePageInterface.js("vmodel",  {vid: this.vid, value: this.value})

                })

       }


}

这个回调特别注意下:

(1)控件拿到所在页面basePageInterface

(2)拿到了页面,就能调用js方法混编了,混编的时候需要指明这是表单的action=vmodel, vid为指定要求的vid值,value就是输入框现在的值。

   (3)vid一般是服务器字段,比如登录页面的用户名vid=name,密码vid=pwd。


二、封装VMButton:

这个很简单了,和上面一样,只是监听点击事件,并在点击后调用

this.basePageInterface.js(this.clickEvent,  {data: this.data})

其中clickEvent为点击事件名,data为区分相同事件的参数(我的页面有体现)。


我们现在有了VMButton,VMTextField, VMTextview,可以实现很多页面的功能了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342