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