KnockoutJS 3.X API 第七章 其他技術(4) 速率限制

来源:http://www.cnblogs.com/smallprogram/archive/2016/10/19/5976428.html
-Advertisement-
Play Games

註意:這個速率限制API是在Knockout 3.1.0中添加的。 通常,更改的observable立即通知其訂戶,以便依賴於observable的任何計算的observable或綁定都會同步更新。 但是,rateLimit擴展器會導致observable在指定的時間段內抑制和延遲更改通知。 因此,... ...


註意:這個速率限制API是在Knockout 3.1.0中添加的。

通常,更改的observable立即通知其訂戶,以便依賴於observable的任何計算的observable或綁定都會同步更新。 但是,rateLimit擴展器會導致observable在指定的時間段內抑制和延遲更改通知。 因此,速率限制的observable非同步更新依賴關係。

速率限制擴展器可以應用於任何類型的可觀察量,包括可觀察數組和計算可觀察量。 速率限制的主要用例是:

  • 使事情在一定延遲後作出反應
  • 將多個更改合併到單個更新中

如果您只需要組合更新而不添加延遲,則延遲更新提供了一種更有效的方法。

應用速率限制擴展

速率限制支持兩種參數格式:

// Shorthand: Specify just a timeout in milliseconds
someObservableOrComputed.extend({ rateLimit: 500 });
 
// Longhand: Specify timeout and/or method
someObservableOrComputed.extend({ rateLimit: { timeout: 500, method: "notifyWhenChangesStop" } });

方法選項控制通知何時觸發,並接受以下值:

  1. notifyAtFixedRate — 未另行指定時的預設值。 通知發生在從第一次更改到可觀察者的指定時間段(最初或自上一次通知之後)。

  2. notifyWhenChangesStop — 通知發生在可觀察者在指定時間段內沒有發生變化之後。 每次可觀察到的變化,該定時器被重置,因此如果可觀察者連續地改變比超時期間更頻繁,則不能發生通知。

示例1:基礎示例

考慮下麵代碼中的observable:

var name = ko.observable('Bert');
 
var upperCaseName = ko.computed(function() {
    return name().toUpperCase();
});

通常,如果您更改名稱如下:

name('The New Bert');

upperCase Name將在下一行代碼運行之前立即完成。 但是如果你改為使用rateLimit定義名稱如下:

var name = ko.observable('Bert').extend({ rateLimit: 500 });

upperCaseName不會在名稱更改時立即重新計算,而是在將其新值通知給upperCaseName之前,將等待500毫秒(半秒),然後重新計算其值。 無論在這500ms內名稱是多少次更改,upperCaseName只會更新一次最新的值。

示例2:當用戶停止輸入時執行某些操作

在這個實例中,有一個instantValue observable,當你按下一個鍵時立即反應。 然後將其封裝在delayedValue計算observable中,該observable配置為僅當更改停止至少400毫秒時通知使用notifyWhenChangesStop rate-limit方法。

嘗試一下:

Type stuff here:

Current delayed value:

Stuff you have typed:

UI源碼:

<p>Type stuff here: <input data-bind='textInput: instantaneousValue' /></p>
<p>Current delayed value: <b data-bind='text: delayedValue'> </b></p>
 
<div data-bind="visible: loggedValues().length > 0">
    <h3>Stuff you have typed:</h3>
    <ul data-bind="foreach: loggedValues">
        <li data-bind="text: $data"></li>
    </ul>
</div>

視圖模型源碼:

function AppViewModel() {
    this.instantaneousValue = ko.observable();
    this.delayedValue = ko.pureComputed(this.instantaneousValue)
        .extend({ rateLimit: { method: "notifyWhenChangesStop", timeout: 400 } });
 
    // Keep a log of the throttled values
    this.loggedValues = ko.observableArray([]);
    this.delayedValue.subscribe(function (val) {
        if (val !== '')
            this.loggedValues.push(val);
    }, this);
}
 
ko.applyBindings(new AppViewModel());

計算可觀測量的特殊考慮

對於計算的observable,當計算的observable的依賴性之一改變而不是其值改變時,觸發速率限制定時器。 計算的observable不會重新求值,直到實際需要它的值 - 在發生更改通知的超時時間段之後,或直接訪問計算的可觀察值時。 如果需要訪問計算的最近評估的值,可以使用peek方法執行此操作。

強制限速觀察者總是通知訂閱者

當any observable的值是原始值(數字,字元串,布爾值或null)時,只有當observable的依賴項設置為實際上與之前不同的值時,才會通知它的依賴項。 因此,原始值的速率限制可觀察量只有當它們的值在超時周期結束時實際上不同時才通知。 換句話說,如果原始值的速率限制的observable被改變為新的值,然後在超時時間段結束之前改變回原始值,則不會發生通知。

如果要確保始終通知訂閱者更新,即使該值相同,除了rateLimit之外,還要使用notify擴展器:

myViewModel.fullName = ko.computed(function() {
    return myViewModel.firstName() + " " + myViewModel.lastName();
}).extend({ notify: 'always', rateLimit: 500 });

與延遲更新的比較

Knockout 3.4.0版本增加了對延遲更新的支持,通過使通知和更新非同步,它的工作方式類似於速率限制。 但是,不是使用定時延遲,而是在執行I / O,迴流或重繪之後,在當前任務之後儘快處理延遲更新。 如果要升級到3.4.0並且使用速率限制超時(例如,0毫秒)的代碼,則可以修改為使用延遲更新:

ko.computed(function() {
    // ....
}).extend({ deferred: true });

 

與throttle延長器比較

如果要使用已棄用的throttle擴展程式遷移代碼,則應註意以下方法,即rateLimit擴展程式與throttle擴展程式不同。

使用rateLimit時:

  1. 對可觀測量的寫入不被延遲; observables值立即更新。 對於可寫的計算可觀測量,這意味著寫函數總是立即運行。
  2. 所有更改通知都會延遲,包括手動調用valueHasMutated時。 這意味著您不能使用valueHasMutated強制速率限制的observable通知未更改的值。
  3. 預設速率限制方法與throttle演算法不同。 要匹配throttle行為,請使用notifyWhenChangesStop方法。
  4. 速率限制的計算觀察值的評估不受速率限制; 如果你讀它的值,它會重新評估。

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Waud.js 是一個Web音頻庫,有一個HTML5音頻降級處理方案。 它允許您利用Web音頻API為你的Web應用程式控制音頻功能。在不支持Web音頻API的非現代瀏覽器使用HTML5音頻降級方案。 ...
  • 關於本系列文章 本系列文章總共8個章節,41篇文章,主要翻譯自官方API文檔,加上自己的一些理解撰寫而成。 區別與園子和網路上的其他一些Knockout教程,這個系列教程將由淺入深的系統的介紹Knockout的知識點和使用細節。 並且本系列KnockoutJS教程是基於最新的3.4.0版本入手的。對... ...
  • Knockout旨在允許您將任意JavaScript對象用作視圖模型。 只要一些視圖模型的屬性是observables,您可以使用KO將它們綁定到您的UI,並且UI將在可觀察屬性更改時自動更新。 大多數應用程式需要從後端伺服器獲取數據。 由於伺服器沒有任何可觀察的概念,它只提供一個純JavaScri... ...
  • 調用 localstorge、cookies 等本地存儲方式 方法一:使用localStorage 使用localStorage.setItem(key,value);添加內容 使用storage事件監聽添加、修改、刪除的動作 window.addEventListener("storage",fu ...
  • <script type="text/javascript"> window.onload = function cc() { var tr=document.getElementsByTagName("tr"); for(var i=0;i<tr.length;i++){ tr[i].style. ...
  • 我現在做的一個項目是angular,但是我用直接引用百度地圖的方法引進js,寫html,js代碼,發現,我去,報錯了,我一開始還以為是百度地圖跟angular有衝突,然後我就去搜索啊,發現angular也有一個百度地圖插件,無奈我用了報錯了,網上說要用angular2版本才能相容,但是我又不會下載2 ...
  • 我們中國嘛傳統段落就是要首行縮進兩個字,首先首行縮進的css是text-indent: 然後這個值是多少呢,一般你的字母的font-size是多少,text-indent:2*font-size的值 比如你的字的字體大小是16px,那麼你想讓段落首行縮進兩個字的話就是text-indent:2*16 ...
  • [TOC] 名詞解釋 state: 它是組件的屬性,主要用來存儲組件自身需要的數據。 虛擬DOM: 它是ReactJS中提出的一個概念,是將真實的DOM結構映射成一個JSON數據結構。 1.組件生命周期 1.創建階段 :該方法會返回一個對象,並緩存下來。然後與父組件指定的props對象合併,最後賦值 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...