【问题标题】:MVVM-KendoNumericTextBox restore previous value without triggering 'change' twiceMVVM-KendoNumericTextBox 恢复以前的值而不触发“更改”两次
【发布时间】:2015-07-22 15:12:25
【问题描述】:

我正在使用 Kendo MVVM,并且我有一个绑定到 kendo observable 的 kendo numerictextbox。 我想要的是:当用户更改值时,应该弹出一个确认,说“你确定吗?”如果是 -> 没问题,继续。 如果没有 -> 什么都不会发生!

理论上听起来很简单……但我发现了 3 个主要问题:

1) numerictextbox 仅获得 2 个事件:旋转和更改...因此放弃使用按键/焦点/或任何其他事件的任何想法。

2) 所以尝试使用更改事件...但我无法阻止默认!另一种尝试是保存以前的值并在“无应答”的情况下将其恢复,但这让我触发了两次事件更改!

3) 任何其他“观察”数字文本框的模型字段都会在我回答确认框之前发生变化......而且我绝对不想要这个!

附:我还有一个下拉列表和一个日期选择器,它们必须以相同的方式工作!

请帮忙!

提供了一个快速示例:http://dojo.telerik.com/EyItE 在这里,您可以看到 numericbox2(正在观察 numericbox1 并被计算)在用户回答是/否之前如何改变自身(问题 3) 并且 keypress/focus/preventDefault 不起作用。

【问题讨论】:

  • 请提供您的代码。
  • 提供了一个快速示例:dojo.telerik.com/EyItE 在这里您可以看到 numericbox2(正在观察 numericbox1 并被计算)在用户回答是/否(问题 3)和按键/焦点/之前如何改变自身preventDefault 不起作用。

标签: kendo-ui kendo-dropdown kendo-mvvm kendo-datepicker kendonumerictextbox


【解决方案1】:

这是一个关于默认不支持的绑定事件的答案: Kendo MVVM and binding or extending custom events

用于 preventDefault(或“恢复”该值)。我尝试按照您的建议存储以前的值,但它不会触发两次:

var viewModel = kendo.observable({
    myItem: { 
      // fields, etc
      myNumericBox: 10,
      myNumericBox2: function () {
        return viewModel.get("myItem.myNumericBox")*2;
      },
      tmp: 10
    },
    onChange: function (e) {
        if ( confirm("are you sure?")) {
                viewModel.set("myItem.tmp", viewModel.get("myItem.myNumericBox"));
          }
          else {
              viewModel.set("myItem.myNumericBox", viewModel.get("myItem.tmp"));

          }
    },
  tryf: function () {
    alert("hello!"); // doesn't trigger
  },
  tryk: function() {
    alert("hello2!"); // doesn't trigger
  }

});

【讨论】:

  • 感谢您的回答。正如您在提供的示例中所见,模型的值发生了变化:1)当您键入另一个数字并失去焦点时。 2)当你按“NO”并将其恢复时。这就是我所说的“两次”!
  • 也许这似乎不是一个大问题......但在我的真实情况下,该字段用于调用绑定到列表视图的数据源!因此,即使在用户按下确认键之前,调用服务并启动模型/ds/listview 的“更改链”确实是一个糟糕的交易!另外,当您按否时,您必须再次调用该服务,当您可以(或至少这是我想要做的)什么都不做时恢复所有计算字段/ds/listview...
  • 知道了。我很抱歉,但我无能为力。希望您至少解决了绑定问题。
【解决方案2】:

我解决了一个自定义绑定,要求您在 html 小部件更改 -> 模型更新之间进行确认。

kendo.data.binders.widget.valueConfirm = kendo.data.Binder.extend({
            init: function (widget, bindings, options) { // start
                kendo.data.Binder.fn.init.call(this, widget.element[0], bindings, options);
                this.widget = widget;
                this._change = $.proxy(this.change, this);
                this.widget.bind("change", this._change); // observe
            },
            refresh: function () { // when model change
                if (!this._initChange) {
                    var widget = this.widget;
                    var value = this.bindings.valueConfirm.get(); // value of the model
                    if (widget.ns == ".kendoDropDownList") { // for the dropdown i have to use select
                        widget.select(function (d) {
                            return d.id == value.id;
                        });
                    }
                    else widget.value(value); // update widget
                }
            },
            change: function () { // when html item change
                var widget = this.widget;
                if (widget.ns == ".kendoDropDownList") var value = widget.dataItem(); // for dropdown i need dataitem
                else var value = widget.value();

                var old = this.bindings.valueConfirm.get();
                    this._initChange = true;
                    // I want to bypass the confirm if the value is not valid (for example after 1st load with blank values).
                    if (old == null || old == 'undefined' || old == 'NaN') this.bindings.valueConfirm.set(value); // Update the View-Model
                    else {
                        if (confirm("Are you sure?")) {
                            this.bindings.valueConfirm.set(value); // Update the View-Model
                        }
                        else {
                            this._initChange = false;
                            this.refresh(); // Reset old value
                        }
                    }
                this._initChange = false;
            },
            destroy: function () { // dunno if this is useful
                this.widget.unbind("change", this._change);
            }
        });

【讨论】:

    猜你喜欢
    • 2023-04-08
    • 1970-01-01
    • 2021-06-05
    • 2013-03-09
    • 2015-06-27
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    相关资源
    最近更新 更多