我在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生成并发保存?
答案 0 :(得分:0)
this.Issue().Deadline.extend({ rateLimit: { timeout: 500,
method: "notifyWhenChangesStop" }
});
来自doc:
notifyWhenChangesStop - 没有任何更改后发生通知 在指定的时间段内发生在观察者身上。每一次 可观察的更改,该计时器被重置,因此通知不能 如果观察者的变化频率持续变化,则会发生 超时期限。
文档 here
(rateLimit是3.1的新内容)
this.Issue().Deadline.extend({ throttle: 500});
文档 here