在使用 Durandal 构建的单页应用程序中,我有一个设置视图,其中包含不同的部分。我使用 childRouter 来解决不同的部分。
在这个应用程序中,许多代码与 Durandal 使用的组合生命周期事件挂钩。例如,这个自定义绑定:
ko.bindingHandlers.autoFocus = {
init: function (element) {
var $element = $(element),
setFocus = function () {
$element.focus();
};
router.on('router:navigation:composition-complete', setFocus);
ko.utils.domNodeDisposal.addDisposeCallback(element, function () {
router.off('router:navigation:composition-complete', setFocus);
$element = null;
});
}
};
到目前为止,此自定义绑定运行良好,将焦点设置到显示视图时应用绑定的字段。
但是,对于子路由器,时间已关闭。似乎主路由器在'router:navigation:composition-complete'
加载“设置”视图时触发了该事件。此时,子视图还没有显示出来,绑定了自动对焦的元素并没有获得焦点。在设置页面之间导航时更清楚地说明了这一点:离开页面时,旧子视图上具有自动对焦绑定的字段获得焦点,然后显示新的子视图而没有焦点元素。
有没有办法让子路由器也省略事件?或者可能让主路由器推迟事件直到子路由器完成?
我还读到这也适用于合成的其他阶段:例如,将不会在子视图的视图模型上调用停用回调。因此,在子路由器上触发事件的一般修复将是我正在寻找的理想解决方案。
提前致谢。