Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/472.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript DurandalJS-在页面根目录上强制执行完整的激活周期(在app.setRoot()上又称为:fire“deactivate”)_Javascript_Single Page Application_Durandal 2.0_Durandal Navigation - Fatal编程技术网

Javascript DurandalJS-在页面根目录上强制执行完整的激活周期(在app.setRoot()上又称为:fire“deactivate”)

Javascript DurandalJS-在页面根目录上强制执行完整的激活周期(在app.setRoot()上又称为:fire“deactivate”),javascript,single-page-application,durandal-2.0,durandal-navigation,Javascript,Single Page Application,Durandal 2.0,Durandal Navigation,[编辑]还有谷歌群组线程。当我了解更多信息时,我会尽量保持这两个方面的更新 根据定义,页面根视图模型只实现有限的激活器功能。具体而言,它指出: 4) 当您调用app.setRoot时,根模块上会使用一个(有限的)激活器 注意:案例4有点不同,因为它只强制canActivate和activate回调;而不是停用生命周期。要实现这一点,您必须自己使用完全激活器(案例1-3) 这意味着与所有嵌套的页面视图模型不同,根视图模型没有机会处理它们的垃圾对象并进行清理 调用app.setRoot()时,在这

[编辑]还有谷歌群组线程。当我了解更多信息时,我会尽量保持这两个方面的更新

根据定义,页面根视图模型只实现有限的激活器功能。具体而言,它指出:

4) 当您调用app.setRoot时,根模块上会使用一个(有限的)激活器

注意:案例4有点不同,因为它只强制canActivate和activate回调;而不是停用生命周期。要实现这一点,您必须自己使用完全激活器(案例1-3)

这意味着与所有嵌套的页面视图模型不同,根视图模型没有机会处理它们的垃圾对象并进行清理

调用app.setRoot()时,在这些对象上触发canDeactivate和deactivate的友好方式是什么?我也许可以手动执行此操作,但我需要对根ViewModel的引用,它不一定在范围内

我曾考虑过创建一个类似于pub/sub的系统,尽管我对此感到厌倦,因为它可能会导致更多的内存问题和清理复杂性,而不是减少它

我已经考虑过分叉这个项目,尽管这会带来一些沉重的开销,因为从那时起我必须维护我的分叉

[编辑]

例如:

假设我要启动应用程序并将shell设置为“main”shell

稍后,我希望切换到一个新的shell。可能是不同的布局、全屏或不同的外观

 app.setRoot('views/shells/accounts');
这将导致shell“accounts”检查和/或激发activate和canActivate,但不会检查shell“main”的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);
            }
        }

也许有办法解决这个问题?如果可能的话,我想避免编辑Durandal的核心

您实际上不必实现多个shell。我们一开始也看到了这一点。您可以有一个shell,然后立即动态地在其中组成一个内部shell。内部外壳可以通过动态组合进行交换,这仍然会保留您的高级路由。换句话说,并非每个视图都必须成为子路径

换言之,以下内容将分为两层,而不是一层:

data-bind="router: { model: router.activeItem, cacheViews:false, compositionComplete: router.compositionComplete, attached: router.attached }">
这将被移动到一个内壳中:

<div data-bind="compose: {model: currentShell()}"></div>


其中,
currentShell()
是一个可观察的对象,它包含当前shell(在“超级shell”的viewModel中)。

我喜欢这个答案,我想马上给它打上绿色的复选标记,但我想看看是否可以先让它工作。星期四下午我会回到办公室。“这看起来真的很有希望。”奥利弗卡内:好的,很高兴听到这个消息!
<div data-bind="compose: {model: currentShell()}"></div>