当移动时间/日期滑块过快时,Datetimepicker 在轻而易举的 / 淘汰赛中生成并发保存错误

Posted

技术标签:

【中文标题】当移动时间/日期滑块过快时,Datetimepicker 在轻而易举的 / 淘汰赛中生成并发保存错误【英文标题】:Datetimepicker generates concurrent saves error in breezejs / knockout when moving the time / date slider too quickly 【发布时间】:2014-08-03 02:19:38 【问题描述】:

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

但是当我更改 datetimepicker 上的滑块时,可观察到的淘汰赛会快速更改多次。如此频繁以至于我得到一个微风错误:

错误:不允许并发保存 - 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 生成并发保存?

【问题讨论】:

看起来好像您在问题中引用了 c#。请添加适当的标签。 上述问题中没有C#代码。它是 Typescript,看起来就像 C#,在编译时被翻译成 javascript。 【参考方案1】:

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

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

来自文档:

notifyWhenChangesStop — 通知发生在没有更改之后 在指定的时间段内发生在 observable 上。每一次 可观察到的变化,计时器被重置,所以通知不能 如果 observable 持续变化的频率高于 超时时间。

文档here

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

(rateLimit 是 3.1 的新功能)

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

文档here

【讨论】:

不幸的是,这也不起作用,尽管我同意这应该起作用。 . . 您确定通知是在截止日期之前发出的吗?尝试在所有可能关注的可观察对象上添加扩展器 这是一个很好的观点。在事件处理程序中设置断点时,属性 data.entity._$typeName 设置为“Issue:#Persistent”。但是在问题上设置 rateLimit 并不能解决问题。我想知道 Issue 被分配了一个轻量级实体 (this.Issue(data.results[0])) 是否与此问题有关。 我对 TypeScriptn 不是很熟悉,但您实际上添加扩展是不是太晚了?它应该在您创建对象时添加,但我觉得您在更新时添加它。你能发布生成的javascript吗? Typescript 被转换为纯 Javascript,所以在运行时只有 Javascript。我已经在创建问题对象时添加了扩展,但存在问题。我想我正在研究 datetimepicker 的自定义绑定

以上是关于当移动时间/日期滑块过快时,Datetimepicker 在轻而易举的 / 淘汰赛中生成并发保存错误的主要内容,如果未能解决你的问题,请参考以下文章

JS—实现拖拽

如何解决Javascript游戏中的按键延迟问题?

进程中的生产者消费者模型

R Shiny server.R 反应式时间/日期滑块,轴变化

短时间内多次查询表格数据渲染问题

鼠标移动太快时不会触发 Mouseover 和 mouseout 事件?