对话框和路由器都是插件,彼此之间没有交互。
也有路由器显示对话框将忽略路由器的工作原理 - 它有一个它转储内容的div。对话存在于所有这些之外。
但是,如果你想(我也可以这样做),你可以试试这个。
将dialog: true
添加到路线图。
重写router.loadUrl
方法。检查路由是否是我们之前标记的对话路由,然后激活对话框。
我会让对话框成为子路线,这样你就可以知道在对话框下面显示哪个视图。否则,你可能只需要显示任何对话并忽略路由。
编辑:我不认为这将完全工作。 loadUrl
返回一个布尔值。您可以打开对话框并返回false以取消导航。
EDIT2:
我尝试
的loadUrl
方法遍历所有路线,每有一个回调,所以非常需要插入我们的逻辑到这个阵列。
for (var i = 0; i < handlers.length; i++) {
var current = handlers[i];
if (current.routePattern.test(coreFragment)) {
current.callback(coreFragment, queryString);
return true;
}
}
将此数组添加到使用路由器route
的方法中。 Durandal在映射路线时调用此方法,所以理想情况下我们可以在路线配置中添加一些额外的参数,并让Durandal处理这些参数。但是configureRoute
函数是路由模块的内部函数,因此我们需要对其进行编辑,并确保在将来更新Durandal时复制更改。
我创建对话框路线的新列表:
{ route: 'taxcode/add(/:params)', moduleId: 'admin/taxcode/add', title: 'Add Tax Code', hash: '#taxcode/add', nav: false, dialog: true, owner: '#taxcodes' },
{ route: 'taxcode/edit/:id', moduleId: 'admin/taxcode/edit', title: 'Edit Tax Code', hash: '#taxcode/edit', nav: false, dialog: true, owner: '#taxcodes' }
所有者的想法是,如果在最初的路线是这样的一个情况下,我们需要对话背后的东西。
现在取代了configureRoute
与此router.route
电话:
router.route(config.routePattern, function (fragment, queryString) {
if (config.dialog) {
if (!router.activeInstruction()) {
// No current instruction, so load one to sit in the background (and go back to)
var loadBackDrop = function (hash) {
var backDropConfig = ko.utils.arrayFirst(router.routes, function (r) {
return r.hash == hash;
});
if (!backDropConfig) {
return false;
}
history.navigate(backDropConfig.hash, { trigger: false, replace: true });
history.navigate(fragment, { trigger: false, replace: false });
queueInstruction({
fragment: backDropConfig.hash,
queryString: "",
config: backDropConfig,
params: [],
queryParams: {}
});
return true;
};
if (typeof config.owner == 'string') {
if (!loadBackDrop(config.owner)) {
delete config.owner;
}
}
if (typeof config.owner != 'string') {
if (!loadBackDrop("")) {
router.navigate("");
return; // failed
}
}
}
var navigatingAway = false;
var subscription = router.activeInstruction.subscribe(function (newValue) {
subscription.dispose();
navigatingAway = true;
system.acquire(config.moduleId).then(function (dialogInstance) {
dialog.close(dialogInstance);
});
})
// Have a route. Go back to it after dialog
var paramInfo = createParams(config.routePattern, fragment, queryString);
paramInfo.params.unshift(config.moduleId);
dialog.show.apply(dialog, paramInfo.params)
.always(function() {
if (!navigatingAway) {
router.navigateBack();
}
});
} else {
var paramInfo = createParams(config.routePattern, fragment, queryString);
queueInstruction({
fragment: fragment,
queryString: queryString,
config: config,
params: paramInfo.params,
queryParams: paramInfo.queryParams
});
}
});
确保导入dialog
到模块。
[如何用DurandalJS创建“完整页面对话框”的可能的重复](http://stackoverflow.com/questions/18537647/how-to-create-full-page-dialog-with-durandaljs) – 2014-10-03 09:51:28
@Tambo ,它不是重复的,op正在寻找没有路由的对话框,因为我正在寻找一个解决方案,其中对话框就像是拥有自己路由的“页面”。 – Dziamid 2014-10-03 13:18:57