最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入淺析knockout源碼分析之訂閱

 更新時(shí)間:2016年07月12日 17:07:11   作者:小龍女先生  
Knockout是一款很優(yōu)秀的JavaScript庫,它可以幫助你僅使用一個(gè)清晰整潔的底層數(shù)據(jù)模型(data model)即可創(chuàng)建一個(gè)富文本且具有良好的顯示和編輯功能的用戶界面。這篇文章主要介紹了knockout源碼分析之訂閱的相關(guān)資料,需要的朋友可以參考下

Knockout.js是什么?

Knockout是一款很優(yōu)秀的JavaScript庫,它可以幫助你僅使用一個(gè)清晰整潔的底層數(shù)據(jù)模型(data model)即可創(chuàng)建一個(gè)富文本且具有良好的顯示和編輯功能的用戶界面。任何時(shí)候你的局部UI內(nèi)容需要自動(dòng)更新(比如:依賴于用戶行為的改變或者外部的數(shù)據(jù)源發(fā)生變化),KO都可以很簡(jiǎn)單的幫你實(shí)現(xiàn),并且非常易于維護(hù)。

一、主類關(guān)系圖

二、類職責(zé)

2.1、observable(普通監(jiān)控對(duì)象類)

observable(他其是一個(gè)function)的內(nèi)部實(shí)現(xiàn):

1.首先聲明一個(gè)名為observable的fn(這個(gè)可以說是一個(gè)類)

2.增加一個(gè)ko惟一的latestValue(最新值)屬性來存儲(chǔ)形參傳入的值

3.如果支持原生__proto__屬性就利用hasOwnProperty來判斷屬性是否存在的方式來繼承,判斷__proto__代碼(在utils類中)

var canSetPrototype = ({ __proto__: [] } instanceof Array);

4.ko.subscribable的fn屬性的init方法對(duì)observable進(jìn)行初始化(主要增加訂閱、發(fā)布相關(guān)屬性)

5.observable再繼承observabelFn相關(guān)屬性和方法(observabelFn包含觀察、值變化前、值變化后的執(zhí)行策略)

// Define prototype for observables
var observableFn = {
'equalityComparer': valuesArePrimitiveAndEqual,
peek: function() { return this[observableLatestValue]; },
valueHasMutated: function () { this['notifySubscribers'](this[observableLatestValue]); },
valueWillMutate: function () { this['notifySubscribers'](this[observableLatestValue], 'beforeChange'); }
};

6.返回observable方法的實(shí)現(xiàn)(如果傳入?yún)?shù)就是設(shè)置,無參則是獲?。?/p>

7、此類還提供了hasPrototype(判斷指定實(shí)例是否擁有此屬性)、isObservable(判斷指定實(shí)例是否為監(jiān)控對(duì)象)、isWriteableObservable(是否為可寫的監(jiān)控對(duì)象)。

2.2、observableArray(數(shù)組監(jiān)控對(duì)象類)

1.先執(zhí)行ko.observable方法,讓其對(duì)象變?yōu)橐粋€(gè)可監(jiān)控的類(名為result);

2.然后擴(kuò)展ko.observableArray中的fn對(duì)象(ko.observabelArray的fn重寫了數(shù)組相關(guān)的操作方法,如remove、push等)

3.通過extends擴(kuò)展一個(gè)方法(trackArrayChanages,詳細(xì)介紹見2.5)

4.返回?cái)U(kuò)展好的result對(duì)象。

ko.observableArray = function (initialValues) {
initialValues = initialValues || [];
if (typeof 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.observableArray['fn']);
return result.extend({'trackArrayChanges':true});
};

2.3、subscribable(訂閱對(duì)象類)

1.實(shí)現(xiàn)訂閱、發(fā)布的功能模塊,對(duì)observable、observableArray來說是必不可少的基類

2.這里有一個(gè)subscrible方法,用于對(duì)監(jiān)控對(duì)象變化的訂閱接口,開發(fā)則可以用此繼切入點(diǎn)

subscribe: function (callback, callbackTarget, event) {
var self = this;
event = event || defaultEvent;
var boundCallback = callbackTarget ? callback.bind(callbackTarget) : callback;
var subscription = new ko.subscription(self, boundCallback, function () {
ko.utils.arrayRemoveItem(self._subscriptions[event], subscription);
if (self.afterSubscriptionRemove)
self.afterSubscriptionRemove(event);
});
if (self.beforeSubscriptionAdd)
self.beforeSubscriptionAdd(event);
if (!self._subscriptions[event])
self._subscriptions[event] = [];
self._subscriptions[event].push(subscription);
return subscription;
}

3.extend:此方法用于添加extends方法加入的擴(kuò)展類(如observableArray.changeTracking擴(kuò)展類)

4.extend擴(kuò)展的方法,會(huì)在監(jiān)控對(duì)象注冊(cè)后立即執(zhí)行,傳入?yún)?shù)為target(當(dāng)前對(duì)象)、options(extend調(diào)用時(shí)傳入的參數(shù))

5.extend就是安裝擴(kuò)展的方法,他會(huì)立即執(zhí)行擴(kuò)展中的代碼。

2.4、extends(擴(kuò)展監(jiān)控對(duì)象類)

1.ko默認(rèn)的擴(kuò)展集合

2.提供一個(gè)applyExtenders方法來安裝擴(kuò)展

function applyExtenders(requestedExtenders) {
var target = this;
if (requestedExtenders) {
ko.utils.objectForEach(requestedExtenders, function(key, value) {
var extenderHandler = ko.extenders[key];
if (typeof extenderHandler == 'function') {
target = extenderHandler(target, value) || target;
}
});
}
return target;
}

2.5、observableArray.changeTracking(擴(kuò)展監(jiān)控對(duì)象的一個(gè)具體實(shí)現(xiàn))

1.此擴(kuò)展主要實(shí)現(xiàn)對(duì)數(shù)組變化的監(jiān)控,然后計(jì)算數(shù)組的差異,以及觸發(fā)相關(guān)的訂閱事件

2.cacheDiffForKnownOperation:緩存對(duì)數(shù)組的操作,以備差異比較

3.beforeSubscriptionAdd、afterSubscriptionRemove相關(guān)訂閱(還沒完全理解作用)。

以上所述是小編給大家介紹的深入淺析knockout源碼分析之訂閱,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!

相關(guān)文章

  • js 窗口抖動(dòng)示例

    js 窗口抖動(dòng)示例

    想必大家對(duì)窗口抖動(dòng)一詞并不陌生吧,其實(shí)原理很簡(jiǎn)單,下面為大家簡(jiǎn)單介紹下js中時(shí)如何實(shí)現(xiàn)的,喜歡的朋友可以參考下
    2013-09-09
  • javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載

    javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載

    這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)圖片預(yù)加載和懶加載,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • javascript 實(shí)現(xiàn)滾動(dòng)效果代碼整理

    javascript 實(shí)現(xiàn)滾動(dòng)效果代碼整理

    javascript 實(shí)現(xiàn)滾動(dòng)效果代碼整理,需要的朋友可以參考下。
    2010-03-03
  • 瀏覽器加載、渲染和解析過程黑箱簡(jiǎn)析

    瀏覽器加載、渲染和解析過程黑箱簡(jiǎn)析

    瀏覽器加載、渲染和解析過程的黑箱分析,對(duì)于渲染,利用 Fiddler 將網(wǎng)速調(diào)慢,可以看到 css 下載后會(huì)馬上渲染到頁面,渲染和下載同步進(jìn)行,需要的朋友可以參考下
    2012-11-11
  • ES6函數(shù)實(shí)現(xiàn)排它兩種寫法解析

    ES6函數(shù)實(shí)現(xiàn)排它兩種寫法解析

    這篇文章主要介紹了ES6函數(shù)實(shí)現(xiàn)排它兩種寫法解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 讓瀏覽器崩潰的12行JS代碼(DoS攻擊分析及防御)

    讓瀏覽器崩潰的12行JS代碼(DoS攻擊分析及防御)

    現(xiàn)在有一段12行的JavaScript代碼,可以讓firefox、chrome、safari瀏覽器崩潰,而且還能讓iphone重啟、安卓閃退,本文作者對(duì)于該12行代碼進(jìn)行了分析解讀并且提出了相應(yīng)的防御辦法,歡迎大家一同探討。有需要的朋友們可以參考借鑒。
    2016-10-10
  • Javascript條件判斷使用小技巧總結(jié)

    Javascript條件判斷使用小技巧總結(jié)

    我們已經(jīng)知道,null?沒有任何的屬性值,并且無法獲取其實(shí)體(existence)值。所以?null.property?返回的是錯(cuò)誤(error)而不是?undefined?。
    2008-09-09
  • 詳解小程序原生使用ES7 async/await語法

    詳解小程序原生使用ES7 async/await語法

    這篇文章主要介紹了詳解小程序原生使用ES7 async/await語法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • 前端如何解決滾動(dòng)穿透問題詳解

    前端如何解決滾動(dòng)穿透問題詳解

    這篇文章主要介紹了前端解決滾動(dòng)穿透問題的五種常見方法,并詳細(xì)分析了它們的優(yōu)缺點(diǎn)和適用場(chǎng)景,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03
  • 菜單效果

    菜單效果

    菜單效果...
    2006-10-10

最新評(píng)論

曲麻莱县| 龙南县| 汝阳县| 桦川县| 广西| 海兴县| 西丰县| 梁河县| 子洲县| 依兰县| 临洮县| 新竹市| 新密市| 原平市| 盱眙县| 措美县| 温泉县| 邯郸县| 达拉特旗| 开封市| 琼海市| 马边| 灵石县| 东乌| 吉水县| 肇庆市| 岐山县| 武清区| 河西区| 康乐县| 鹤壁市| 竹山县| 闵行区| 阜康市| 株洲市| 洛川县| 慈溪市| 黑龙江省| 奈曼旗| 南安市| 囊谦县|