升级到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="click: $root.modal.close">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);
有趣的是,如果我在断点上停留足够长时间,问题就不会发生。但是一旦它发生一次,它就再也无法打开对话框了。
有更好的方法吗?
三江源。