Angularjs 尝试避免使用$rootScope时路由更改事件

Angularjs 尝试避免使用$rootScope时路由更改事件,angularjs,angularjs-routing,angularjs-rootscope,Angularjs,Angularjs Routing,Angularjs Rootscope,正如(和几个)建议的那样,我尽量避免在我的应用程序中使用$rootScope $rootScope存在,但可用于邪恶 “当然,全局状态很糟糕,您应该谨慎使用$rootScope, 就像您(希望)在任何语言中使用全局变量一样。 特别是,不要将其用于代码,只用于数据 将函数放在$rootScope上,将其放在 可以在需要的地方注入服务,而且更容易 测试。”-来自 但在我的一个应用程序中,我多次使用$rootScope广播事件,例如$routeChangeStart: /* Force redirec

正如(和几个)建议的那样,我尽量避免在我的应用程序中使用
$rootScope

$rootScope
存在,但可用于邪恶

“当然,全局状态很糟糕,您应该谨慎使用
$rootScope
, 就像您(希望)在任何语言中使用全局变量一样。 特别是,不要将其用于代码,只用于数据 将函数放在
$rootScope
上,将其放在 可以在需要的地方注入服务,而且更容易 测试。”-来自

但在我的一个应用程序中,我多次使用
$rootScope
广播事件,例如
$routeChangeStart

/* Force redirection to home page when a connected user calls login page */
$rootScope.$on("$routeChangeStart", function(event, next, current) {
    if(next.$$route.originalPath == '/login' && Session.isUserConnected()) {
        $location.path("/home");
    }
}
在这些情况下,我看不到避免
$rootScope
的方法

  • 有没有更优雅的方法来做这种把戏
  • 这是我使用它的应用程序的设计错误吗
  • 我必须在绝对必要的时候使用它吗


如果您希望我提供更多的代码示例,请告诉我。

如果您不想在此场景中使用
$rootScope
y您可以使用功能强大的
解决方法来实现这一点

因为我看到您正在使用
ngRoute
模块,所以我为
ngRoute
resolve创建了Plunker和代码。如果您需要,我也可以为
ui路由器创建一个

使用Resolve可以加快代码的执行速度,因为它不会经历DigestCycle

通过注入会话,您可以从
会话.isUserConnected()
获取用户标志

然后可以使用该变量重定向路由

//代码在这里
角度模块('Test',['ngRoute']))
.config(函数($routeProvider){
var user=true;
//var user=Session.isUserConnected();您可以在此处使用您的逻辑
$routeProvider
.when(“/login”{
模板:“登录视图”,
决心:{
数据:函数($q、$timeout、$location){
var deferred=$q.deferred();
$timeout(函数(){
如果(用户){
$location.path(“/home”);
拒绝();
}否则{
延迟。解决();
}
});
回报。承诺;
}
}
})
.when(“/home”{
模板:“主视图。通过检查用户条件从登录重定向。不使用rootscope”,
})
。否则({重定向到:'/login'});
})

你读错了。 首先,这个事件是由Angular团队添加的-你认为他们建议不要使用它吗?:D那篇文章是关于你不应该把所有东西都放在$rootScope上,这对初学者来说似乎是一个简单的方法


实际上,在全局事件中使用
$rootScope
-是完全可以的——这是此服务的实际目的。

您是否阅读了这篇
全局状态糟糕透顶的文章,并且应该节约使用$rootScope
?@RameshRajendran是的,来自我提供的(最后一段)。它来自Angular documentation FAQ。对于这种情况,您只是在收听向$rootScope广播的事件,我认为这是一个有效的用例。有趣的观点。就性能和设计而言,这是否比使用
$rootScope
更好?您认为我应该使用它吗,或者这只是一个“如何做得不同”的建议?由于
$rootScope
中的更改将再次运行摘要循环,而resolve在调用路由时仅运行一次,因此与
$routeScope
相比,resolve可能会更好,正如您所问,它是
$rootScope
的替代方案。它没有回答,因为我认为它更复杂,而且不确定性能是否更好。无论如何,我对你展示另一种方法来做这类事情的努力投了更高的票。:-)Np,等待更多的答案,我也会寻找其他的方法我想知道是否有关于如何构造此代码的“良好实践”(因为它位于$rootScope中,您可以在任何地方编写),以便它尽可能保持清晰易读。应在app.run()中提供“始终正确的全局内容”。--(因为它将始终在应用程序初始化时执行)