Javascript breeze/durandal:configureBreezeManager().saveChanges()不';t触发器功能已更改更改

Javascript breeze/durandal:configureBreezeManager().saveChanges()不';t触发器功能已更改更改,javascript,breeze,durandal,hottowel,Javascript,Breeze,Durandal,Hottowel,我一直在按照Hottowl的例子创建一个网站。但是,调用saveChanges后,hasChanges的值不会更改,甚至数据实际上也保存在数据库表中。我使用热毛巾durandal 2.0.1。我发现durandal版本与CCJS Scratch示例不同。我错过什么了吗 datacontext.js var manager = configureBreezeManager(); var hasChanges = ko.observable(false); manager.

我一直在按照Hottowl的例子创建一个网站。但是,调用
saveChanges
后,
hasChanges
的值不会更改,甚至数据实际上也保存在数据库表中。我使用热毛巾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);
        }
    };

也许你有时间问题?你有很多嵌套的观测值和计算的观测值,我在这么晚的时候很难对齐

我所知道的是Breeze DocCode:saveTodoTests.js显示在保存更改和还原时(
rejectChanges
)使用正确的
eventArgs.hasChanges
值调用了
HasChangesChanges
)。这里有一个来自该套件的通过测试来证实这一点

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);
});
请注意,
hasChangesChanged
事件在此测试中引发了两次

请再次尝试调试,并确保您正在查看的事件是在保存后引发的事件,而不是在其他操作期间引发的事件


还要注意KO事件的嵌套。比赛条件是可能的。

代码与Johny Papa的Hottow CCJS Scratch示例中的代码几乎完全相同。
manager.rejectChanges()将触发该函数。您的挑战是验证它。我已经提供了DocCode证明该函数按预期工作。我刚刚调试了我的HotTower CCJS Scratch示例副本(承认在v.1.4.1中很旧),它的行为符合预期。球在你的球场上提供一个失败的小样本。