茄子在线看片免费人成视频,午夜福利精品a在线观看,国产高清自产拍在线观看,久久综合久久狠狠综合

    <s id="ddbnn"></s>
  • <sub id="ddbnn"><ol id="ddbnn"></ol></sub>

  • <legend id="ddbnn"></legend><s id="ddbnn"></s>

    深入淺析knockout源碼分析之訂閱
    來源:易賢網(wǎng) 閱讀:1485 次 日期:2016-07-28 14:44:27
    溫馨提示:易賢網(wǎng)小編為您整理了“深入淺析knockout源碼分析之訂閱”,方便廣大網(wǎng)友查閱!

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

    Knockout.js是什么?

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

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

    名單

    二、類職責

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

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

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

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

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

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

    4.ko.subscribable的fn屬性的init方法對observable進行初始化(主要增加訂閱、發(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方法的實現(xiàn)(如果傳入?yún)?shù)就是設(shè)置,無參則是獲?。?/P>

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

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

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

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

    3.通過extends擴展一個方法(trackArrayChanages,詳細介紹見2.5)

    4.返回擴展好的result對象。

    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(訂閱對象類)

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

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

    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方法加入的擴展類(如observableArray.changeTracking擴展類)

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

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

    2.4、extends(擴展監(jiān)控對象類)

    1.ko默認的擴展集合

    2.提供一個applyExtenders方法來安裝擴展

    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(擴展監(jiān)控對象的一個具體實現(xiàn))

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

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

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

    以上所述是小編給大家介紹的深入淺析knockout源碼分析之訂閱,希望對大家有所幫助

    更多信息請查看網(wǎng)絡(luò)編程
    易賢網(wǎng)手機網(wǎng)站地址:深入淺析knockout源碼分析之訂閱

    2026上岸·考公考編培訓(xùn)報班

    • 報班類型
    • 姓名
    • 手機號
    • 驗證碼
    關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
    工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
    聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
    咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)