breeze / durandal:configureBreezeManager()。saveChanges()不触发函数订阅hasChangesChanged

时间:2013-12-22 00:53:50

标签: javascript breeze durandal hottowel

我一直在按照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);
        }
    };

1 个答案:

答案 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活动的嵌套。比赛条件是可能的。