关于model层变更如何通知controller层
Posted mrzhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于model层变更如何通知controller层相关的知识,希望对你有一定的参考价值。
在ios的mvvm模式中,model层的变更主要有两种方式,一种是delegate,一种是kvo
delegate就是定义一套协议,然后controller实现这套协议,在数据变更的时候直接通过delegate通知controller层,因为delefate需要实现很多协议,会有一点低耦合,而kvo的解决办法是,在controller层 去监听某个model的某个属性,然后写一个统一的方法去相应属性的变更,这样的好处就是 我不需要去指定实现某种协议,所以的变更控制都在controller层。那这些对于前端mvvm有何借鉴意义呢?
之前在前端model层通知controller层主要还是通过类似代理的方式来实现,这样就是controller层 需要实现指定的协议,举一个例子,
我们有一个user数据层,主要处理和user相关的数据,比如获取数据列表,一般如果用deledate的话,就是在数据请求结束后,调用delegate.dataFinish之类的方法去处理数据,那如果用kvo的实现方式,我们就应该在user层 定义一个userList数组,用来把所有请求过来的数据全部放在userList数组里面,然后controller层 去监听这个userList的变化,如果变化了 就更新界面
具体实现:
//model层 class User{ constructor() { this.dep = {} this._userList = [];//这里主要监听userList } get userList() { return this._userList; } set userList(data) { this._userList = data; if(this.dep.hasOwnProperty("userList")){ let _noticefy = this.dep[_key]; for(let i = 0; i < _noticefy.length; i++){ _noticefy[i](data); } } } addObserver(options){ let _key = options.key;//监听的属性字段 let _noticefy = options.noticefy;//属性变更后触发的方法 if(this.dep.hasOwnProperty(_key)){ this.dep[_key].push(_noticefy); }else{ this.dep[_key] = [_noticefy]; } } } //在controller层,我们如果需要使用的话,我们就可以监听 let _user = new User(); _user.addObserver({ key:"userList", noticefy:function(){} }) //这样的话 是不是真正的数据驱动了呢?
以上是关于关于model层变更如何通知controller层的主要内容,如果未能解决你的问题,请参考以下文章
图解springboot 五层结构 view controller service mapper model