Angular 尝试在登录后发出事件以显示主菜单,但我的变量从未收到该事件

Angular 尝试在登录后发出事件以显示主菜单,但我的变量从未收到该事件,angular,angular2-routing,angular2-template,Angular,Angular2 Routing,Angular2 Template,编辑: 这可能是一个更适合我回答的问题,因为它更有用 因此,我有一个带有导航栏的主app.component和一个单独的登录页面。我想要的是,当他们登录时,他们可以看到菜单,否则他们看不到。如果我能为localStorage事件添加一个更改,那就太好了。这样,我就可以在localStorage事件中动态更改一个菜单 @组件({ 选择器:“我的应用程序”, 提供者:[表单提供者、角色服务、用户服务、登录、登录服务], 输入:['loggedIn'], 指令:[路由器指令、核心指令、LoggedIn

编辑:

这可能是一个更适合我回答的问题,因为它更有用

因此,我有一个带有导航栏的主app.component和一个单独的登录页面。我想要的是,当他们登录时,他们可以看到菜单,否则他们看不到。如果我能为localStorage事件添加一个更改,那就太好了。这样,我就可以在localStorage事件中动态更改一个菜单

@组件({
选择器:“我的应用程序”,
提供者:[表单提供者、角色服务、用户服务、登录、登录服务],
输入:['loggedIn'],
指令:[路由器指令、核心指令、LoggedInRouterOutlet],
模板:`
  • 但我似乎不知道我做错了什么

    我想知道是否设置了localstorage显示菜单。谢谢!

    当您想与整个应用程序共享时,不要将服务(
    LoginService
    ,…)添加到组件
    提供程序:
    列表。只将其添加到

    bootstrap(AppComponent, [OtherProviders, LoginService]);
    
    当您将服务添加到组件时,将为此组件创建一个新的(不同的)实例,它的子实例与其他组件接收的子实例不同。当服务仅添加到
    bootstrap()
    时,整个应用程序共享同一个服务实例

    您的服务还需要
    @Injectable()
    装饰器

    @Injectable()
    export class Login{
    

    将此项也添加到所有其他服务中(如果服务没有构造函数参数,则严格来说不需要).

    好的,我这样做了,但是我的事件发射器在我登录时仍然没有向我的appComponent发送布尔值。它实际上什么都没有做。因此我的appComponent从未收到对我的菜单的更改。this
    login.loggedIn.subscribe((数据)=>this.onUserChanged(数据));
    从未收到任何东西。您在所有相关服务中都这样做了吗(不仅仅是
    登录服务
    )?我还更新了我的答案。是的,我更新了,我想这可能与我试图调用Login有关:从非注入的构造函数中登录。我的问题是,如果不这样做,我不知道如何以合理的方式分离我的应用程序。不确定“非注入”和“分离我的应用程序”是什么意思.你能详细说明你想完成什么吗?我在@Component上使用构造函数{Login:Login},而不是@Injectable,我不确定这是否有什么区别。我所说的“分离我的应用程序”是什么意思问题是如何划分应用程序以分离关注点。我的事件发射器无法将其分配到其他组件,我仍不清楚原因。