Knockout.js Durandal干扰敲除绑定?
我正在构建一个应用程序,它使用Durandal和Knockout,当我使用Durandal导航到SPA中的一个页面时,似乎出现了问题。当我从主屏幕加载应用程序并导航到第二个页面(该页面有一系列级联下拉列表)时,它看起来好像绑定中断了。如果我刷新页面并加载第二个页面以开始绑定,那么所有这些似乎都能按预期工作。第一页现在除了标题外没有其他内容,第二页有层叠下拉列表。我真的不知道在这个问题上包括什么代码,所以如果有什么人们想看的,请随时提问。我正在使用“Knockout context”Chrome插件查看敲除上下文,除了结果没有显示外,一切似乎都正常 存在问题的更简单的视图模型Knockout.js Durandal干扰敲除绑定?,knockout.js,single-page-application,durandal,Knockout.js,Single Page Application,Durandal,我正在构建一个应用程序,它使用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…我得到的错误与我在本地得到的不同。您想将此对话从某某转到电子邮件或其他对话方式吗?