在knockout.js中是否有办法默认对所有可观测值进行限价?
我不想一个接一个地extend
所有我的观察者。
答案 0 :(得分:4)
您可以创建一个要使用的函数而不是ko.observable。我这样做只是为了节省打字,我自己:var KOB = ko.observable;
对于你的情况,它会是(类似的):
var KOB = function (value) {
return ko.observable(value).extend({rateLimit:500});
};
答案 1 :(得分:2)
但首先,让我说AFAIK没有办法用Knockout功能做你想做的事情;没有全局设置(类似于ko.globalSettings["defaultRateLimit"]
)来为所有未来的可观测值设置默认速率限制。
尽管如此,这是一种以简单明了的方式完成按照你的要求修补Knockout的方法。但是,我认为这是一个相当晚/最后的手段:使用猴子修补,你永远不知道它将如何影响框架的未来版本。此外,这将不可逆转地更改ko.observable
,以便它按照您的要求执行,没有例外。
(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>
对于更具范围的解决方案,我建议您@RoyJ's solution创建一个新的速记函数来执行您想要的操作。它允许你更多的控制,这是伟大的,因为我无法想象任何实际的生产场景,你想要所有 observables rateLimited,至少是因为它使单元测试他们相当多更新变得异步更难。
最后一个选择当然是分叉Knockout本身,这很容易,因为它是source is available on GitHub。
答案 2 :(得分:1)
您可以在ko.observable
上创建一个函数,为您的代码添加一些语法糖。 http://knockoutjs.com/documentation/fn.html
所以不要写作
ko.observable(value).extend({rateLimit: 500})
可以写
ko.observable(value).limit(500)
我还没有对此进行过测试,但是值得探索这个或者可能是自定义绑定data-bind="rateLimitValue: fullName"