关于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层的主要内容,如果未能解决你的问题,请参考以下文章

MVC介绍

SpringMVC

图解springboot 五层结构 view controller service mapper model

三层架构是啥?

谁能告诉我ASP.NET MVC中,model,view,control层之间到底是啥关系?

iOS中的MVC和MVVM