深化浅析knockout源码分析之订阅_.docx

上传人:啊飒飒 文档编号:11566879 上传时间:2021-08-24 格式:DOCX 页数:7 大小:13.82KB
返回 下载 相关 举报
深化浅析knockout源码分析之订阅_.docx_第1页
第1页 / 共7页
深化浅析knockout源码分析之订阅_.docx_第2页
第2页 / 共7页
深化浅析knockout源码分析之订阅_.docx_第3页
第3页 / 共7页
深化浅析knockout源码分析之订阅_.docx_第4页
第4页 / 共7页
深化浅析knockout源码分析之订阅_.docx_第5页
第5页 / 共7页
亲,该文档总共7页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《深化浅析knockout源码分析之订阅_.docx》由会员分享,可在线阅读,更多相关《深化浅析knockout源码分析之订阅_.docx(7页珍藏版)》请在三一文库上搜索。

1、深化浅析knockout源码分析之订阅_ Knockout是一款很优秀的JavaScript库,它可以关心你仅用法一个清楚干净的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的用户界面。这篇文章主要介绍了knockout源码分析之订阅的相关资料,需要的伴侣可以参考下 Knockout.js是什么? Knockout是一款很优秀的JavaScript库,它可以关心你仅用法一个清楚干净的底层数据模型(data model)即可创建一个富文本且具有良好的显示和编辑功能的用户界面。任何时候你的局部UI内容需要自动更新(比如:依靠于用户行为的转变或者外部的数据源发生改变

2、),KO都可以很简洁的帮你实现,并且特别易于维护。 一、主类关系图 二、类职责 2.1、observable(一般监控对象类) observable(他其是一个function)的内部实现: 1.首先声明一个名为observable的fn(这个可以说是一个类) 2.增加一个ko惟一的latestValue(最新值)属性来存储形参传入的值 3.假如支持原生_proto_属性就利用hasOwnProperty来推断属性是否存在的方式来继承,推断_proto_代码(在utils类中) var canSetPrototype = ( _proto_: instanceof Array); 4.ko.s

3、ubscribable的fn属性的init方法对observable进行初始化(主要增加订阅、发布相关属性) 5.observable再继承observabelFn相关属性和方法(observabelFn包含观看、值改变前、值改变后的执行策略) / Define prototype for observables var observableFn = equalityComparer: valuesArePrimitiveAndEqual, peek: function() return thisobservableLatestValue; , valueHasMutated: functio

4、n () thisnotifySubscribers(thisobservableLatestValue); , valueWillMutate: function () thisnotifySubscribers(thisobservableLatestValue, beforeChange); ; 6.返回observable方法的实现(假如传入参数就是设置,无参则是猎取) 7、此类还供应了hasPrototype(推断指定实例是否拥有此属性)、isObservable(推断指定实例是否为监控对象)、isWriteableObservable(是否为可写的监控对象)。 2.2、observ

5、ableArray(数组监控对象类) 1.先执行ko.observable方法,让其对象变为一个可监控的类(名为result); 2.然后扩展ko.observableArray中的fn对象(ko.observabelArray的fn重写了数组相关的操作方法,如remove、push等) 3.通过extends扩展一个方法(trackArrayChanages,具体介绍见2.5) 4.返回扩展好的result对象。 ko.observableArray = function (initialValues) initialValues = initialValues | ; if (typeof

6、 initialValues != object | !(length in initialValues) throw new Error(The argument passed when initializing an observable array must be an array, or null, or undefined.); var result = ko.observable(initialValues); ko.utils.setPrototypeOfOrExtend(result, ko.observableArrayfn); return result.extend(tr

7、ackArrayChanges:true); ; 2.3、subscribable(订阅对象类) 1.实现订阅、发布的功能模块,对observable、observableArray来说是必不行少的基类 2.这里有一个subscrible方法,用于对监控对象改变的订阅接口,开发则可以用此继切入点 subscribe: function (callback, callbackTarget, event) var self = this; event = event | defaultEvent; var boundCallback = callbackTarget ? callback.bind

8、(callbackTarget) : callback; var subscription = new ko.subscription(self, boundCallback, function () ko.utils.arrayRemoveItem(self._subscriptionsevent, subscription); if (self.afterSubscriptionRemove) self.afterSubscriptionRemove(event); ); if (self.beforeSubscriptionAdd) self.beforeSubscriptionAdd(

9、event); if (!self._subscriptionsevent) self._subscriptionsevent = ; self._subscriptionsevent.push(subscription); return subscription; 3.extend:此方法用于添加extends方法加入的扩展类(如observableArray.changeTracking扩展类) 4.extend扩展的方法,会在监控对象注册后立刻执行,传入参数为target(当前对象)、options(extend调用时传入的参数) 5.extend就是安装扩展的方法,他会立刻执行扩展中的

10、代码。 2.4、extends(扩展监控对象类) 1.ko默认的扩展集合 2.供应一个applyExtenders方法来安装扩展 function applyExtenders(requestedExtenders) var target = this; if (requestedExtenders) ko.utils.objectForEach(requestedExtenders, function(key, value) var extenderHandler = ko.extenderskey; if (typeof extenderHandler = function) target

11、 = extenderHandler(target, value) | target; ); return target; 2.5、observableArray.changeTracking(扩展监控对象的一个具体实现) 1.此扩展主要实现对数组改变的监控,然后计算数组的差异,以及触发相关的订阅大事 2.cacheDiffForKnownOperation:缓存对数组的操作,以备差异比较 3.beforeSubscriptionAdd、afterSubscriptionRemove相关订阅(还没完全理解作用)。 以上所述是我给大家介绍的深化浅析knockout源码分析之订阅,盼望对大家有所关心 .

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 科普知识


经营许可证编号:宁ICP备18001539号-1