首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Durandal干扰Knockout绑定?

Durandal干扰Knockout绑定?
EN

Stack Overflow用户
提问于 2013-05-07 08:56:59
回答 2查看 932关注 0票数 1

我有一个正在使用Durandal和Knockout构建的应用程序,当我使用durandal导航到我的SPA中的一个页面时,似乎有一个问题。当我从主屏幕加载应用程序并导航到具有一系列级联下拉菜单的第二个页面时,它看起来就像是绑定断开了。如果我刷新页面并加载第二个页面以开始绑定,那么一切似乎都像预期的那样工作。第一个页面现在除了标题之外什么都没有,第二个页面有级联下拉菜单。老实说,我不确定在这个问题上包括什么代码,所以如果有任何人想看到的东西,请随时询问。我正在使用'Knockout Context‘Chrome插件窥探Knockout上下文,除了没有显示结果之外,一切似乎都在运行。

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

代码语言:javascript
复制
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调用如下所示

代码语言:javascript
复制
datacontext.lookups = {
    manufacturers: function ()
    { return getLocal('Manufacturers', 'name', true); }
};
EN

回答 2

Stack Overflow用户

发布于 2013-05-07 18:15:33

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

代码语言:javascript
复制
function activate() {
    vm.manufacturers(datacontext.lookups.manufacturers());
    logger.log('Frames View Activated', null, 'frames', false);
    return true;
};

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

代码语言:javascript
复制
function activate() {
    logger.log('Frames View Activated', null, 'frames', false);
    return datacontext.lookups.manufacturers().then(querySuccess);

    function querySuccess(data)
    {
        vm.manufacturers(data.results);
    };
};
票数 0
EN

Stack Overflow用户

发布于 2013-05-08 05:24:56

我没有使用breeze,所以我不知道getLocal()是否是异步的,但如果有疑问,请返回一个封装的$.when(syncOrAsync).then(...)

代码语言:javascript
复制
function activate() {
    var manufacturesPromise = datacontext.lookups.manufacturers();
    logger.log('Frames View Activated', null, 'frames', false);

    return $.when(manufacturesPromise).then(function(results){
       manufacturers(results);
    });
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16409562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档