對話框和路由器都是插件,彼此之間沒有交互。
也有路由器顯示對話框將忽略路由器的工作原理 - 它有一個它轉儲內容的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