码迷,mamicode.com
首页 > 其他好文 > 详细

关于model层变更如何通知controller层

时间:2019-02-28 16:55:02      阅读:331      评论:0      收藏:0      [点我收藏+]

标签:javascrip   nis   mvvm   方法   class   变化   前端   lse   多协议   

在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层

标签:javascrip   nis   mvvm   方法   class   变化   前端   lse   多协议   

原文地址:https://www.cnblogs.com/mrzhu/p/10451212.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!