[英]Why do I need $rootScope.$apply when inside $rootScope.$on?
[英]AngularJS Route Cancelling — why do I need to use $rootScope?
我有一个表单,我想防止用户导航而不将其数据保存回服务器。 我从这里借来的代码使我可以向$locationChangeStart
事件添加一个侦听器。 我将以下代码放入窗体的控制器中,瞧瞧,什么都没发生。
var cancelRouteListener = $rootScope.$on('$locationChangeStart', checkForUnsavedData);
function checkForUnsavedData (event, newURL) {
if (!$scope.form.$dirty) {
return;
}
var proceed = $window.confirm('The page has unsaved changes. Do you want to continue?');
if (proceed) {
cancelRouteListener();
$location.path(newURL);
}
event.preventDefault();
return;
}
我可以看到代码到达了$location.path()
的调用,但是页面导航没有改变。 然后,我出于绝望,尝试在调用$rootScope.$apply()
包装该行代码:
$rootScope.$apply(function () {
$location.path(newURL);
}
瞧,那行得通。 我有几个问题:
.$apply()
函数? 我以为代码会在$ rootScope的上下文中运行。 $rootScope
吗? 当表单的路由处于活动状态时,我仅需要此侦听器。 首先,您不是说$apply()
吗? 其次,为什么要在控制器中使用$rootScope
而不是$scope
来启动摘要循环。 第三,我认为您没有使用正确的逻辑来实现所需的功能。 $locationChangeStart
事件表示Angular应用程序中位置更改的开始。 $window.confirm()
将在调用event.preventDefault()
暂时停止导航。 因此,您应该等待$window.confirm()
确认。 如果使用点击取消,则proceed
将为假。 如果proceed
为false,则调用event.preventDefault()
,否则不执行任何操作。 当应用程序已经导航到该页面时,绝对不需要调用$location.path()
。
我在这里创建了一个Plunk场景:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.