knockout js - 在我的HTML页面中,我有一个下拉列表和JQgrid,用户可以在其中添加新行。如果用户在保存网格数据之前更改下拉值,我想提醒用户他是否要保存网格数据或继续。如果用户想要保存数据,则下拉值应为旧值,否则为新值。
我面临的问题是下拉值已变为新值。
我在下拉列表的selectedItem上有敲除js订阅方法。在订阅方法中,存在填充网格的逻辑。
答案 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;
这样做的缺点是只能进行单向绑定,这意味着如果您的可观察值会从其他来源更改,则下拉列表将不会使用该新值更新。如果您需要保留双向绑定,那么您可能希望尝试使用自定义绑定处理程序,例如:gated value binding