使用Durandal 2.0.1(由于项目开发的限制,无法更新到2.1.0),我对此问题标题中显示的错误有间歇性问题。
我正在做的就是定义一个自定义对话框然后显示它:
var pleaseWaitModal = new modalBusy();
dialog.show(pleaseWaitModal);
当我的ajax电话结束时,我做了:
dialog.close(pleaseWaitModal);
...然后显示另一个带有我的ajax调用结果的模态。
如果ajax调用需要半秒到一秒,这一切都能正常工作。如果这是一个更快的调用,那么我在控制台窗口中得到Uncaught TypeError: Cannot read property 'host' of undefined
。盒子仍然关闭,只是我得到一个恐慌的项目经理询问红色错误是什么......
这纯粹是因为我试图在“dialog.show()”在某些情况下正确完成之前运行“dialog.close()”吗?
事件的顺序基本上是:
*user instigates action requiring a detailed modal dialog to appear with data in it
*as it takes several seconds to populate on some occasions, an interim modal dialog is shown with "please wait" in it
*once the ajax request is complete, the "pleasewait" modal is closed and the "detail" modal is shown
*so a bit like:
var pleaseWaitModal = new modalBusy();
dialog.show(pleaseWaitModal);
//set up deferred calls for ajax data and call ...
var deferredAjax = callDataFunction(myparams...);
return deferredAjax.then(function(result) {
dialog.close(pleaseWaitModal);
var detailModal = new detailModal();
detailModal.show(result);
});
所以我认为我不能使用dialog.show(pleaseWaitModal)
电话上的承诺来实现这一点,是吗?
答案 0 :(得分:0)
你是否正在使用从dialog.close函数返回的promise来打开你的新模态?你可以试试这个:
从最初的对话框开始:
dialog.show(new modal()).then(function(responseData) {
dialog.show(new pleaseWaitModal(responseData));
});
我认为您遇到的问题是异步时序相关,这就是为什么使用延期作品的原因。
编辑:与我在下面的评论相关,你可能会看一下只使用一个模态,并在其中添加一个加载指示器,如下所示:
view.html
<div data-bind="visible: isLoading">
<h1>Please wait...</h1>
<i class="icon-spin icon-spinner icon-4x"></i>
</div>
modalViewModel.js
var vm = {
isLoading: ko.observable(true)
};
vm.activate = function() {
makeAjaxCall().then(function(data) {
vm.isLoading(false);
**Do whatever you need for your ajax return**
return true;
});
});
我认为这应该可以满足您的需求。