observe

Posted chennanxiangbei

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了observe相关的知识,希望对你有一定的参考价值。

 1 //存放所有事件的对象
 2 const eventMap = {};
 3 
 4 /*
 5     事假绑定  一个事件对应这个多个回调函数  
 6     key:[]  key值代表事件名称  回调函数都存放在[]里面
 7 */
 8 let $on = function(eventName,callback){
 9     /*
10         eventName:事件名称
11         callback:回调函数
12 
13         一个事件名称可能会对应多个回调函数  
14     */
15 
16     //判断当前对象里面的事件是否存在  如果没有存在我就赋值一个空的数组
17     //然后在将这个回调push这个数组里面
18     if(!eventMap[eventName]){
19         eventMap[eventName] = [];
20     }
21     eventMap[eventName].push(callback);
22 }
23 
24 
25 //触发的时候要知道一个事件是对应着多个函数 所以所有的事件都要触发
26 //但是如果用户传递的这个事件在eventMap中根本不存在的话我就什么也不干,
27 //如果存在则拿到所以的回调函数然后执行
28 let $emit = function(eventName,val){
29     let newList = eventMap[eventName];
30     if(!eventMap[eventName]){
31         return;
32     }
33     newList.map(cb=>{
34         cb(val);
35     })
36 }
37 
38 /*
39     如果用户没有传递callback 那么就解绑所有的事件
40     如果用户传递了callback那么就解绑对应的函数
41 */
42 let $off = function(eventName,callback){
43     let newList = eventMap[eventName];
44     if(!callback){
45         eventMap[eventName] = null;
46     }
47     eventMap[eventName] = newList.filter(cb=>{
48         return cb != callback
49     })
50 }
51 
52 export default {
53     $on,
54     $emit,
55     $off
56 }

 

以上是关于observe的主要内容,如果未能解决你的问题,请参考以下文章

Fragment Recreation 导致 Observer 使用 Androidx Navigation 库触发 onChanged()

Live Data Observer On 按钮 屏幕旋转时单击

只有Kotlin协同程序的数据流?

如何在基础活动暂停时暂停rxjava Observable.interval

根据另一个 Spinner 选择 (LiveData) 过滤 Spinner 的 Observed ViewModel 数据

Android Room LiveData观察器未更新