Knockout js - 如果某些条件不匹配,如何将下拉值更改为先前值

时间:2017-02-23 16:40:37

标签: javascript knockout.js

knockout js - 在我的HTML页面中,我有一个下拉列表和JQgrid,用户可以在其中添加新行。如果用户在保存网格数据之前更改下拉值,我想提醒用户他是否要保存网格数据或继续。如果用户想要保存数据,则下拉值应为旧值,否则为新值。

我面临的问题是下拉值已变为新值。

我在下拉列表的selectedItem上有敲除js订阅方法。在订阅方法中,存在填充网格的逻辑。

1 个答案:

答案 0 :(得分:1)

observable上的subscribe方法告诉你在更改后的值已更改为什么,所以不幸的是,它已经来不及取消。我认为您可以通过绑定到change事件而不是使用值绑定来完成您想要的任务,并且如果它通过您的条件,则使用新值手动更新observable。



var viewModel = function() {
  var self = this;
  self.Options = [1, 2, 3, 4];
  self.selectedOption = ko.observable();
  self.selectedOption.subscribe(function(newValue) {
    console.log(newValue);
  });

  self.isOptionValid = function(value) {
    return (value > 2);
  }

  self.onChange = function(viewModel, event) {
    var target = event.target;
    var newValue = $(target).val();
    if (self.isOptionValid(newValue)) {
      self.selectedOption(newValue);
    } else {
      console.log('Invalid selection');
      $(target).val(self.selectedOption()); //reset to previous value
    }
  }
}

ko.applyBindings(new viewModel());

<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.2.0/knockout-min.js"></script>

<div>
  <span>Pick a number greater than 2</span><br/>
  <Select data-bind="options: Options, optionsCaption: '', event: {change: onChange}">  
  </Select>
</div>
&#13;
&#13;
&#13;

这样做的缺点是只能进行单向绑定,这意味着如果您的可观察值会从其他来源更改,则下拉列表将不会使用该新值更新。如果您需要保留双向绑定,那么您可能希望尝试使用自定义绑定处理程序,例如:gated value binding