Knockout.js Durandal干扰敲除绑定?

Knockout.js Durandal干扰敲除绑定?,knockout.js,single-page-application,durandal,Knockout.js,Single Page Application,Durandal,我正在构建一个应用程序,它使用Durandal和Knockout,当我使用Durandal导航到SPA中的一个页面时,似乎出现了问题。当我从主屏幕加载应用程序并导航到第二个页面(该页面有一系列级联下拉列表)时,它看起来好像绑定中断了。如果我刷新页面并加载第二个页面以开始绑定,那么所有这些似乎都能按预期工作。第一页现在除了标题外没有其他内容,第二页有层叠下拉列表。我真的不知道在这个问题上包括什么代码,所以如果有什么人们想看的,请随时提问。我正在使用“Knockout context”Chrome插

我正在构建一个应用程序,它使用Durandal和Knockout,当我使用Durandal导航到SPA中的一个页面时,似乎出现了问题。当我从主屏幕加载应用程序并导航到第二个页面(该页面有一系列级联下拉列表)时,它看起来好像绑定中断了。如果我刷新页面并加载第二个页面以开始绑定,那么所有这些似乎都能按预期工作。第一页现在除了标题外没有其他内容,第二页有层叠下拉列表。我真的不知道在这个问题上包括什么代码,所以如果有什么人们想看的,请随时提问。我正在使用“Knockout context”Chrome插件查看敲除上下文,除了结果没有显示外,一切似乎都正常

存在问题的更简单的视图模型

define(['services/logger',
    "services/datacontext"],
function (logger, datacontext) {
    var manufacturers = ko.observableArray();
    var manufacturer = ko.observable();
    var isSaving = ko.observable(false);
    var modelsWithSizes = ko.observableArray();

    manufacturer.subscribe(function (newValue) {
        datacontext.getBikeModelsWithSizes(modelsWithSizes, newValue.manufacturerID());
    });


    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);
        }
    };

    var canDeactivate = function () {
        if (hasChanges()) {
            var title = 'Do you want to leave ?';
            var msg = 'Navigate away and cancel your changes?';
            var checkAnswer = function (selectedOption) {
                if (selectedOption === 'Yes') {
                    cancel();
                }
                return selectedOption;
            };
            return app.showMessage(title, msg, ['Yes', 'No'])
                .then(checkAnswer);

        }
        return true;
    };

    var vm = {
        activate: activate,
        cancel: cancel,
        canDeactivate: canDeactivate,
        canSave: canSave,
        hasChanges: hasChanges,
        manu: manufacturer,
        manufacturers: manufacturers,
        modelsWithSizes: modelsWithSizes,
        save: save
    };

    return vm;

    //#region Internal Methods
    function activate() {
        manufacturers(datacontext.lookups.manufacturers),
        logger.log('Frames View Activated', null, 'frames', false);
        return true;
    }


    //#endregion
});
datacontext调用如下所示

datacontext.lookups = {
    manufacturers: function ()
    { return getLocal('Manufacturers', 'name', true); }
};

如果datacontext.lookups.manufacturers是预加载的observableArray,则可能需要将激活功能更改为:

function activate() {
    vm.manufacturers(datacontext.lookups.manufacturers());
    logger.log('Frames View Activated', null, 'frames', false);
    return true;
};

如果datacontext.lookups.manufacturers是对web api的异步调用,则需要将其更改为:

function activate() {
    logger.log('Frames View Activated', null, 'frames', false);
    return datacontext.lookups.manufacturers().then(querySuccess);

    function querySuccess(data)
    {
        vm.manufacturers(data.results);
    };
};

我没有使用breeze,所以我不知道
getLocal()
是否是异步的,但如果有疑问,请在(syncOrAsync)时返回一个包装的
$。然后(…)

function activate() {
    var manufacturesPromise = datacontext.lookups.manufacturers();
    logger.log('Frames View Activated', null, 'frames', false);

    return $.when(manufacturesPromise).then(function(results){
       manufacturers(results);
    });
}

您需要包括一些代码,如“页面”Viewmodels模块,以及调用您的激活功能的代码。我添加了一些更简单的Viewmodels有问题的代码。当你提到调用activate函数的时候,你是说shell.js和router.map调用吗?我很好奇“datacontext.lookups.manufacturers”是ajax还是异步调用?如果是这样的话,我就被绊倒了,因为你应该从激活调用返回一个承诺。我添加了datacontext调用…这是一个getLocal Breeze调用,我认为应该是同步的。它是一个预加载的数组,我已经将它转换为一个函数,并将其包含在原始问题中。当我的viewmodel文件中缺少分号时,我遇到了一些问题。尽量确保所有函数都有一个结尾分号。这很有意义。但是当我实现它时,我的绑定仍然被破坏,我不知道为什么。你能模拟datacontext请求并使用OOTB Durandal创建一个测试用例吗?这个repo()正在进行中,缺乏深入的文档,但它可能是生成测试用例的最快方法,可以在这里讨论。OOTB?如果你认为有帮助的话,我可以开始制作一个小提琴,试图重现这个问题。我已经推高了一个回购协议@我刚刚开始尝试模拟datacontext,并将继续填充它,直到我可以让它运行。雷纳-我模拟了datacontext…我得到的错误与我在本地得到的不同。您想将此对话从某某转到电子邮件或其他对话方式吗?