2015-05-13 4 views
7

Gibt es einen Weg in knockout.js, um alle Observablen standardmäßig einzuschränken?Geschwindigkeitsbegrenzung für alle Observablen standardmäßig

Ich möchte nicht alle extend alle meine Observablen eins nach dem anderen.

+0

wäre das Ratenlimit eine globale Einstellung oder einstellbar? – BillPull

+1

Sie sollten das wahrscheinlich nicht tun, es sei denn, Sie wissen wirklich, was Sie tun oder haben eine sehr begrenzte Anwendung von Observablen. Weil die Rate alle einschränkt, bedeutet das, dass Abhängigkeiten in zufälliger Reihenfolge ausgelöst werden und Ihre Logik manchmal funktioniert, aber zu anderen Zeiten bricht. Außerdem würdest du dich mit allem herumschlagen, das auch beobachtbar ist. Sei vorsichtig, wenn du so verrückte Sachen machst. – Milimetric

+0

Dies könnte eine Aufgabe sein, für die mein Plugin [knockout-deferred-updates] (https://github.com/mbest/knockout-deferred-updates) geeignet ist. Wir sind auch dabei, ähnliche Funktionen für die nächste Version von Knockout bereitzustellen. –

Antwort

1

Sie könnten eine Funktion auf ko.observable erstellen, die Ihrem Code etwas syntaktischen Zucker hinzufügen würde. http://knockoutjs.com/documentation/fn.html

so anstelle des Schreibens ko.observable(value).extend({rateLimit: 500})

könnte es möglich sein, zu schreiben ko.observable(value).limit(500)

ich dies noch nicht getestet haben, aber würde sich lohnen, diese zu erkunden oder möglicherweise eine benutzerdefinierte Bindung data-bind="rateLimitValue: fullName"

4

können Sie Erstellen Sie eine Funktion, die anstelle von ko.observable verwendet werden soll. Ich mache das nur zu speichern tippen, mich: var KOB = ko.observable;

Für Ihren Fall wäre es (so etwas wie):

var KOB = function (value) { 
    return ko.observable(value).extend({rateLimit:500}); 
}; 
2

Affe sehen, Affe tun: Affe Patch!

Aber zuerst, lassen Sie mich sagen, dass AFAIK gibt es keine Möglichkeit zu tun, was Sie wollen mit einer Knockout-Funktion; Es gibt keine globale Einstellung (irgendetwas wie ko.globalSettings["defaultRateLimit"]), um Standardratengrenzen für alle zukünftigen Observablen festzulegen.

Nichtsdestoweniger, hier ist eine Möglichkeit, Affe Patch Knockout in einer direkten Art und Weise zu tun, genau wie Sie fragen. Allerdings würde ich dies als einen eher späten/letzten Ausweg betrachten: Mit Affe-Patches können Sie nie wissen, wie sich zukünftige Versionen eines Frameworks auswirken. Auch dies wird unwiderruflich ändern ko.observable, so dass es tut, was Sie fragen, keine Ausnahmen.

(function() { 
 
    var originalObservableFn = ko.observable; 
 
    ko.observable = function(x) { 
 
    return originalObservableFn(x).extend({rateLimit: 1500}); 
 
    } 
 
})(); 
 

 
var vm = { 
 
    myValue: ko.observable("initial value") 
 
}; 
 

 
ko.applyBindings(vm);
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script> 
 

 
Change value here: <input data-bind="textInput: myValue" autofocus /><br /> 
 
Read only version: <span data-bind="text: myValue"></span>

Für eine scoped Lösung würde ich @RoyJ's solution empfehlen, wo Sie eine neue Kurzschrift-Funktion erstellen, um zu tun, was Sie wollen. Es ermöglicht Ihnen ein bisschen mehr Kontrolle, was großartig ist, weil ich mir kein praktisches Produktionsszenario vorstellen kann, wo Sie wollen alle Observables rateLimited, nicht im geringsten, weil es Unit-Testing sie ein bisschen schwieriger macht, da Updates asynchron werden .

Eine letzte Option natürlich wäre, Knockout selbst zu Gabel, die einfach ist, wie es source is available on GitHub ist.

Verwandte Themen