当过快地移动时间/日期滑块时,Datetimepicker会在breezejs / knockout中生成并发保存错误

时间:2014-06-12 16:47:51

标签: javascript jquery knockout.js breeze datetimepicker

我在Knockout / Breeze / Typescript webapp中使用trentrichardson中的datetimepicker。在进行更改时会自动保存实体(称为“问题”)。

但是当我更改datetimepicker上的滑块时,knockout observable会快速更改多次。我经常遇到一个轻微的错误:

  

错误:不允许并发保存 - SaveOptions.allowConcurrentSaves   是假的

当我稍微改变滑块时,不会产生错误并且实体存储正确。我试图设置rateLimit,但这似乎不起作用。

这是我保存更改的方式:

public SubscribeToChanges() {
    this.BreezeEntityManager.entityChanged.subscribe((data: breeze.EntityChangedEventArgs) => {
        if (data.entityAction == breeze.EntityAction.PropertyChange) {
            this.BreezeEntityManager.saveChanges()
            .fail((error) => alert("Failed: " + error));
        }
    });
}

编译为JavaScript:

 this.BreezeEntityManager.entityChanged.subscribe(function (data) {
      if (data.entityAction == breeze.EntityAction.PropertyChange) {
           _this.BreezeEntityManager.saveChanges().fail(function (error) {
               return alert("Failed: " + error);
          });
      }
  });

我试过设置rateLimit所以不应该有这么多的更新。我用以下代码完成了这个:

this.BreezeEntityManager
            .executeQuery(query)
            .then((data) =>{
                this.Issue(<Issue>data.results[0]);
                this.Issue().Deadline.extend({ rateLimit: 5000});
            })
            .fail((error) => alert("Failed: " + error));

编译为JavaScript:

this.BreezeEntityManager.executeQuery(query).then(function (data) {
                            _this.Issue(data.results[0]);
                            _this.Issue().Deadline.extend({ rateLimit: 5000 });
                        }).fail(function (error) {
                            return alert("Failed: " + error);
                        });

由于这不起作用,我还尝试在构造函数中设置实体(问题)本身的rateLimit:

        this.Issue.extend({
            rateLimit: {
                timeout: 5000,
                method: "notifyWhenChangesStop"
            }
        });

但没有结果。

HTML:

<input type="text" data-bind="value: Issue().Deadline"/>

问题是这样创建的:

public Issue: KnockoutObservable<Persistent.Issue> = ko.observable<Persistent.Issue>();

如何阻止datetimepicker生成并发保存?

1 个答案:

答案 0 :(得分:0)

如果您使用的是淘汰赛3.1,这应该可行:

this.Issue().Deadline.extend({ rateLimit: { timeout: 500, 
                                            method: "notifyWhenChangesStop" }
                            });

来自doc:

  

notifyWhenChangesStop - 没有任何更改后发生通知   在指定的时间段内发生在观察者身上。每一次   可观察的更改,该计时器被重置,因此通知不能   如果观察者的变化频率持续变化,则会发生   超时期限。

文档 here

如果您使用的是以前的版本,请改用throttle:

(rateLimit是3.1的新内容)

this.Issue().Deadline.extend({ throttle: 500});

文档 here