敲除得到文本框的旧值

knockout get old value of the text box

我正在使用地图插件。每当有人从文本框上移开焦点时,我都会发生 on 'blur' 事件。我想知道旧值是否与新值不同。这适用于 "enter" 键。出于某种原因,每当我更改值并按回车键时,我都会第一次获得此控制台输出; 'oldValue | newValue'。然而,当 'blur' 触发时情况并非如此。我得到 'newValue | newValue'

怎么会呢。我怎样才能得到模糊的新旧值?

HTML:

<input class="percent-text" data-bind="text: Percent, value: Percent, event: { keypress: $root.percentUpdate, blur: $root.percentUpdate }" type="number" min="1" max="100" oninput="maxlength(this)" maxlength="3" />

淘汰赛:

    self.percentUpdate = function (data, event) {
        if (event.keyCode === 13 || event.type == 'blur') {
            var $target = $(event.currentTarget);
            console.log(data.Percent() + " | " + event.target.value); 
        }
        return true;
    };

Knockout 在模糊时更新值,并且该值可能在您的模糊事件之前更新。我不知道你到底想做什么,但我会考虑使用 .subscribe 和 .subscribe with beforeChange。

http://knockoutjs.com/documentation/observables.html

例如

data.Percent.subscribe(function(newValue) {
    alert(newValue)
});

data.Percent.subscribe(function(oldValue) {
        alert(oldValue)
    }, null, "beforeChange");

你可以用你的方法来做(我有一个成功的测试用例),但正如@AnotherDev 提到的那样,使用内置工具更简单。在 subscribe 函数中,您可以访问值 beforeafter 它被更改,并据此采取行动。如果您希望之后仍然能够检索以前的值,您可以通过 缓存 前面的值,甚至所有前面的值(在一个数组中)轻松地做到这一点。请注意,在 fiddle 中可以观察到 cachedPercent(s) 的唯一原因是更新 viewModel JSON;在一个真正的应用程序中,我会使用普通数组/数字(和 ev. 在私有变量中)。

在下面的fiddle中进行测试;使用这种方法,ENTER 键函数只需要手动调用 valueHasMutated 来通知订阅函数。

function App(percent) {
  var self = this;
  this.cachedPercent = ko.observable(percent || 0);
  this.cachedPercents = ko.observableArray([percent || 0]);
  this.PercentRaw = ko.observable(percent || 0);
  // Percent stores an integer, and is ratelimited to make sure
  // that the value isn't stored 1000x every time the user increments
  this.Percent = ko.computed(function() { 
    return parseInt(self.PercentRaw()); 
  }).extend({rateLimit: 500});
  this.storePercents = this.Percent.subscribe(function(oldVal) {
    // delete this if clause if you want to manually check somewhere else
    // because this tells JS not to store any value when similar to the previous one
    if (self.cachedPercent() !== oldVal) {
      self.cachedPercent(self.Percent());
      self.cachedPercents.splice(0, 0, self.Percent());
    }
  }, null, 'beforeChange');
}
ko.applyBindings(new App(50));
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<input data-bind="value: PercentRaw, 
                  event: {keydown: function(d, e) { if (e.keyCode === 13) PercentRaw.valueHasMutated(); } " type="number" min="1" max="100" maxlength="3" class="percent-text" />

<pre data-bind="text: ko.toJSON($root, null, 2)"></pre>