[Изменить] Также есть ветка Google Groups здесь. Я постараюсь держать оба в курсе, когда узнаю больше.
Согласно документации Durandal, модель корневого представления страницы реализует только ограниченные функции активатора. В частности, в нем говорится, что:
....
4) Когда вы вызываете app.setRoot, в вашем корневом модуле используется (ограниченный) активатор.
Примечание. Случай 4 немного отличается, так как он применяет только обратные вызовы canActivate и активировать; а не жизненный цикл деактивации. Для этого вы должны самостоятельно использовать полный активатор (случаи 1-3).
Это означает, что в отличие от всех ViewModels с вложенными страницами, у корневых нет возможности избавляться от своих ненужных объектов и очищаться.
Каков дружественный способ запустить как canDeactivate, так и деактивировать эти объекты, когда я вызываю app.setRoot()? Возможно, я мог бы сделать это вручную, но мне понадобится ссылка на корневую ViewModel, которая не обязательно входит в область действия.
Я думал о создании своего рода системы pub/sub, хотя я устал от этого, потому что это может вызвать БОЛЬШЕ проблем с памятью и сложностью очистки, чем уменьшить ее.
Я рассматривал возможность разветвления проекта, хотя это сопряжено с большими накладными расходами, поскольку с этого момента мне придется поддерживать свою разветвленную структуру.
[РЕДАКТИРОВАТЬ]
Пример:
Допустим, я должен был запустить свое приложение и установить оболочку в «основную» оболочку.
app.start().then(function () {
app.setRoot('views/shells/main');
})
Через некоторое время я хочу переключиться на новую оболочку. Возможно другой макет, полноэкранный режим или другой скин.
app.setRoot('views/shells/accounts');
Это заставит «учетные записи» оболочки проверять и/или запускать активацию и канактивацию, но НЕ будет проверять «основную» оболочку на наличие canDeactivate и deactivate. У меня есть логика очистки, которую я хочу запустить, когда они исчезнут. Как я могу это сделать?
[РЕДАКТИРОВАТЬ]
Часть кода durandal, которая обрабатывает это, является локальной функцией, находящейся в модуле 'durandal/app' setRoot() finishComposition(). Выглядит это так
function finishComposition() {
if(settings.model) {
if (settings.model.canActivate) {
try {
var result = settings.model.canActivate();
if (result && result.then) {
result.then(function (actualResult) {
if (actualResult) {
composition.compose(hostElement, settings);
}
}).fail(function (err) {
system.error(err);
});
} else if (result) {
composition.compose(hostElement, settings);
}
} catch (er) {
system.error(er);
}
} else {
composition.compose(hostElement, settings);
}
} else {
composition.compose(hostElement, settings);
}
}
Возможно, есть способ исправить это? Я хотел бы избежать редактирования ядра Дюрандаля, если это возможно.