2015-05-13 18 views
7

Tüm gözlenebilirleri varsayılan olarak derecelendirmek için knockout.js yolunda bir yol var mı?Tüm gözlenebilirlikleri varsayılan olarak sınırlandırma oranı

Gözlemlerim tek tek extend'a sahip olmak istemiyorum.

+0

Hız sınırı global ayar mı yoksa ayarlanabilir mi? – BillPull

+1

Gerçekten ne yaptığınızı bilmediğiniz veya çok sınırlı gözlenebilir uygulamalara sahip olmadığınız sürece bunu gerçekten yapmamalısınız. Bunların tümünü sınırlayan oran bağımlılıkların rastgele sırayla tetikleneceği anlamına gelir ve mantığınız bazen işe yarayabilir ancak diğer zamanlarda kırılabilir. Ayrıca gözlemlenebilir kullanan herhangi bir şeyle uğraşırdınız. Sadece böyle çılgın şeyler yaparken dikkatli ol. – Milimetric

+0

Bu benim eklentim [knockout-ertelenmiş güncellemeler] (https://github.com/mbest/knockout-deferred-updates) için uygun bir görev olabilir. Ayrıca Knockout'un bir sonraki sürümü için benzer işlevsellik sağlama sürecindeyiz. –

cevap

1

ko.observable üzerinde, kodunuza bazı sözdizimsel şeker ekleyen bir işlev oluşturabilirsiniz. böylece yazma yerine http://knockoutjs.com/documentation/fn.html

ko.observable(value).extend({rateLimit: 500})

ben henüz bu test sığınak ko.observable(value).limit(500)

yazmak mümkün olabilir ama bu da muhtemelen özel bir bağlama keşfetmeye değer olacağını data-bind="rateLimitValue: fullName"

4

yapabilirsiniz ko.observable yerine kullanılacak bir işlev oluşturun. Bu sadece kurtarmak için yazmaya yapmak, kendim: davanızı için var KOB = ko.observable;

, bu (bir şey) gibi olacaktır:

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

Maymun bkz maymun yapar: maymun yama!

Ama önce, AFAIK'ın Knockout özelliği ile istediğiniz şeyi yapmanın bir yolu olmadığını söyleyeyim; Gelecekteki tüm gözlenebilirler için varsayılan oran limitlerini ayarlamak için küresel bir ayar yoktur (ko.globalSettings["defaultRateLimit"] gibi).

Yine de, işte tam olarak istediğin gibi yapmak için basit bir şekilde maymun nakavt yapmaktır. Bununla birlikte, bunun oldukça geç/son çare olduğunu düşünürüm: maymun yamalarıyla, bir çerçevenin gelecekteki sürümlerini nasıl etkileyeceğini asla bilemezsiniz. Ayrıca, bu, ko.observable'u değiştirilemeyecek şekilde değiştirir, böylece istediğinizi yapar, istisna yoktur. Daha kapsamına sahip çözüm için

(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>

İstediğin şeyi yapmak için yeni bir stenografi işlev oluşturmak @RoyJ's solution öneriyoruz. Oldukça biraz daha fazla kontrol sağlar, çünkü tüm gözlenebilirler rateLimited istediğiniz herhangi bir pratik üretim senaryosunu hayal edemiyorum, en az değil çünkü üniteler onları asenkronize edildikçe daha da zorlaştırıyor . Son bir seçenek elbette ki source is available on GitHub olan Knockout'u çatallamak olacaktır.