升级到 durandal 2.0 后,我发现我需要将我的主列表页面转换为使用 showDialog 功能而不是 showModal。
以前我的主模型是这样的:
define(['durandal/amd/require', 'durandal/app', 'durandal/viewLocator', 'durandal/system', 'durandal/plugins/router', 'durandal/lib/tableModel', 'viewmodels/product'], function (require, app, viewLocator, system, router, table, product) {
var tm = {
tableModel: new tableModel(),
createProduct: function (data) {
app.showModal(product, data);
}
}
//...
return tm;
}
然后在我的产品详细信息视图页面中,我可以像这样轻松关闭模式
data-bind="点击: $root.modal.close">关闭
现在在 Durandal 2.0 中,要正确处理要困难得多。
母版页中的代码现在是
define(['durandal/app', 'durandal/viewLocator', 'durandal/system', 'plugins/router', 'lib/xhrs', 'lib/tableModel'], function (app, viewLocator, system, router, xhrs, table, product) {
var tm = {
tableModel: new tableModel(),
createProduct: function (data) {
app.showDialog(product, data);
}
}
//...
return tm; }
但是访问close函数的方式很烦人:
首先,我必须在产品详细视图模型中加入“插件/对话框”;我不希望这样做,因为我认为细节视图模型不需要知道它是一个对话框,只有主列表视图模型需要知道这一点。
然后在我分配的产品详细视图模型的 compositionComplete 事件中:
prodedit.close = function () {
dialog.close(prodedit);
}
(prodedit 是作为产品详细信息 vm 返回的)
这样,可以使用以下命令关闭产品详细信息对话框:
data-bind="click: $root.close"
好的,现在这是我的问题:
这将弹出对话框一次或两次,但从那时起失败而没有错误。我唯一能看到的是 dialogActivator.activateItem 达到了它的失败线: dfd.resolve(false);
有趣的是,如果我在断点处暂停足够长的时间,问题就不会发生。但是一旦发生一次,它就再也无法打开对话框了。
有一个更好的方法吗?
谢谢你。