我一直在按照Hottowl的例子创建一个网站。但是,调用hasChanges
后,saveChanges
的值不会更改 - 即使数据实际上保存在数据库表中也是如此。我使用hottowel durandal 2.0.1。我发现durandal版本与CCJS-Scratch示例不同。我错过了什么吗?
datacontext.js
var manager = configureBreezeManager();
var hasChanges = ko.observable(false);
manager.hasChangesChanged.subscribe(function (eventArgs) {
hasChanges(eventArgs.hasChanges); // The function isn't called when saveChanges is called
});
var cancelChanges = function () {
manager.rejectChanges();
log('Canceled changes', null, true);
};
var saveChanges = function () {
return manager.saveChanges()
.then(saveSucceeded)
.fail(saveFailed);
function saveSucceeded(saveResult) {
log('Saved data successfully', saveResult, true);
}
function saveFailed(error) {
var msg = 'Save failed: ' + getErrorMessages(error);
logError(msg, error);
error.message = msg;
throw error;
}
};
视图模型中存在以下代码。
var hasChanges = ko.computed(function () {
return datacontext.hasChanges();
});
var cancel = function () {
datacontext.cancelChanges();
};
var canSave = ko.computed(function () {
return hasChanges() && !isSaving();
});
var save = function () {
isSaving(true);
return datacontext.saveChanges().fin(complete);
function complete() {
isSaving(false);
}
};
答案 0 :(得分:1)
也许你有时间问题?你有很多嵌套的observable和计算的observable,我在这么晚的时候很难对齐。
我所知道的是Breeze DocCode:saveTodoTests.js 显示,当保存更改和还原时,hasChangesChanged
会使用正确的eventArgs.hasChanges
值进行调用({{ 1}})。以下是该套件的通过测试,证实了这一点。
rejectChanges
请注意,在此测试中,test("hasChangesChanged event raised after saveChanges", 4, function () {
var em = newTodosEm();
var hasChangesChangedRaised = [];
em.hasChangesChanged.subscribe(
function(eventArgs) {
hasChangesChangedRaised.push(eventArgs.hasChanges);
}
);
// add a Todo (and forget about it)
em.createEntity('TodoItem',{ Description: "Learn to save in breeze" });
stop();
em.saveChanges()
.then ( function() {
equal(hasChangesChangedRaised.length, 2,
"hasChangesChanged should have been raised twice");
ok(hasChangesChangedRaised[0]===true,
"first hasChangesChanged is true after create");
ok(hasChangesChangedRaised[1]===false,
"second hasChangesChanged is false after save");
ok(!em.hasChanges(),
"manager should not have pending changes after save");
})
.fail(handleSaveFailed)
.fin(start);
});
事件会被引发两次。
请再次尝试调试,并确保您正在查看的事件是保存后的,而不是在其他操作期间。
还要注意KO活动的嵌套。比赛条件是可能的。