【问题标题】:KnockoutJs - How to "synchronize" subscriptions and click event?KnockoutJs - 如何“同步”订阅和点击事件?
【发布时间】:2016-08-08 09:56:48
【问题描述】:

简单的情况。我有带有文本框的表单,绑定到 observables。 Observables 订阅了一些逻辑(服务器验证等,只是一些 ajax 调用)。

表单上还有一个带有一些“保存数据”逻辑的按钮。只有在所有回调完成后才能保存数据。

订阅会在值发生变化时触发,主要是在焦点丢失时,而不仅仅是在每次更改时。

现在您可以简单地在文本框中输入任何内容,然后立即单击保存按钮。发生什么了?点击事件被调用,数据被保存。但有时它会比订阅事件触发和服务器返回数据更快。

如何将点击与订阅的“完成”承诺“同步”?我需要防止在一切完成之前保存数据。但是订阅文本框值和按钮之间没有关系。一切都是异步的,所以我不能只在点击事件中调用“等待函数”之类的东西。其他问题应该是订阅稍后触发然后单击事件。

有什么解决办法吗?

【问题讨论】:

    标签: ajax knockout.js


    【解决方案1】:

    添加一个变量来管理按钮状态 -

    <button data-bind="disable: serverSideCheckInProgress">Save Data</button>
    

    在您的 ajax 调用中 -

    //declare serverSideCheckInProgress false on init
    
    saveData = function(){
      serverSideCheckInProgress(true);
      $.ajax({
        url: "test.html",
        context: document.body
      }).done(function() {
        serverSideCheckInProgress(false);
      });
    }
    

    【讨论】:

    • 已经这样做了,但是订阅文本框 observable 稍后会触发,然后单击按钮。有一些延迟。因此按钮已启用,用户单击然后敲除会在焦点丢失且值已更改时触发文本框注释。这很奇怪,但在这种情况下,它对我来说是有效的。
    猜你喜欢
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多