默认情况下限制所有可观察量

时间:2015-05-13 15:36:13

标签: javascript knockout.js

在knockout.js中是否有办法默认对所有可观测值进行限价?

我不想一个接一个地extend所有我的观察者。

3 个答案:

答案 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"