Angular 2:让组件自动检测服务中的变量变化

2024-01-02

我目前面临的问题是,从功能上讲,当用户登录时,我的导航栏不会自动更新以向他们显示正确的链接。仅当我手动刷新不需要的页面时,它才会更新,因为这是单页面应用程序。我可以正常处理注销,因为注销按钮和功能位于控制导航栏的组件内。但是,登录是通过身份验证服务控制的,对我的组件不可见。我尝试过制作isLoggedInboolean public,然后将组件导入到身份验证服务中,并在登录时将值设置为 true,但这会产生非描述性的 zone.js 错误。请参阅下文 - 感谢所有帮助。

app.component它控制我的导航栏:

export class AppComponent implements OnInit{
    private isLoggedIn: boolean;

    constructor(private router: Router, private authenticationService: AuthenticationService) { }

    ngOnInit() {
        this.isLoggedIn = this.authenticationService.isLoggedIn();
    }

    logout() {
        this.isLoggedIn = false;
        this.authenticationService.logout();
        this.router.navigate([""]);
    }

    title = 'MYlestone';
}

and the app.component模板:

<div class="site-container">
    <nav class="navbar navbar-toggleable-md">
        <div *ngIf="isLoggedIn">
            <span class="navbar-brand text-color">MYlestone</span>
        </div>
        <div *ngIf="!isLoggedIn">
            <span class="navbar-brand text-color" [routerLink]="['']" style="cursor:pointer">MYlestone</span>
        </div>
        <div>
            <div class="navbar-nav" *ngIf="isLoggedIn">
                <a class="nav-item nav-link" href="#" [routerLink]="['content']">My Content</a>
                <a class="nav-item nav-link" href="#" [routerLink]="['about']">About</a>
                <div class="ml-auto">
                    <a class="nav-item nav-link" href="#" (click)="logout()">Logout</a>
                </div>
            </div>
        </div>
    </nav>
    <div class="container-fluid text-color">
        <!-- let client side routing take over, see app.routing.ts -->
        <router-outlet></router-outlet>
    </div>
</div>

如你看到的,isLoggedIn在 ngOnInit 方法中设置[正确],并且当单击注销按钮时我的组件会适当更新。我正在努力弄清楚如何更新isLoggedIn当用户登录时,此组件中的布尔值发生在执行此组件的 ngOnInit 方法之后。以防万一,您可以在下面找到authentication.service,它负责实际登录用户:

@Injectable()
export class AuthenticationService {
    constructor(private http: Http) { }

    login(email: string, password: string) {
        return this.http.post('http://localhost:36000/api/accounts/authenticate', { email: email, password: password })
            .map((response: Response) => {
                let user = response.json();
                if (user && user.token) {
                    localStorage.setItem('currentUser', JSON.stringify(user));
                }
            });
    }

    logout() {
        localStorage.removeItem('currentUser');
    }

    isLoggedIn() {
        //check to see if token exists
        if (localStorage.getItem('currentUser')) {
            return true;
        }
        else {
            return false;
        }
    }
}

在你的组件类中,你可以isLoggedIn从服务获取当前值的属性。 Angular 的变更检测机制将在适当的时候访问它并更新渲染的 HTML。

public get isLoggedIn(): boolean {
    return this.authenticationService.isLoggedIn();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Angular 2:让组件自动检测服务中的变量变化 的相关文章

随机推荐

  • 显示文件或对象之间的差异

    R 中有没有一种方法可以比较对象并返回有用的信息 例如差异在哪里 我需要比较文件 但愿意将它们读入 data frames 这可能可以通过命令行更好地处理 但我想将我的测试封装到一个 R 脚本中 我的下一次尝试是使用 ddply 将每一行发
  • 在第二台显示器上打开新的浏览器页面

    嗯 简单的情况 是否可以通过 Web 应用程序检测用户是否具有双显示器设置 如果可能的话 是否可以在第二台显示器上打开子浏览器页面 以便新窗口不会与旧窗口重叠 我问的原因是 我正在开发一个网络应用程序 并且家里有一个双显示器系统 当我转到该
  • 在 Kotlin 中读取所有输入行的简洁方法

    进行编码挑战时的常见模式是读取多行输入 假设您事先不知道有多少行 您想要读取直到 EOF readLine 返回 null 另外作为前言 我不想依赖 java utils 因为我是用 KotlinNative 编码的 所以没有 Scanne
  • 如何使用存储在字段值中的正则表达式执行正则表达式查找?

    给定以下模型 from django db import models from django conf import settings class UserMessage models Model user models ForeignK
  • “error_description”:“AADSTS70002:请求正文必须包含以下参数:'client_secret 或 client_assertion'

    我使用了代码https github com AzureAD azure activedirectory library for java blob master src samples public client app sample s
  • SparkContext 错误 - 文件未找到 /tmp/spark-events 不存在

    通过 API 调用运行 Python Spark 应用程序 提交申请时 响应 失败 通过 SSH 连接到 Worker 我的Python应用程序存在于 root spark work driver id wordcount py 错误可以在
  • 公制距离的正则表达式

    我想要一个RegEx匹配公制系统中的距离值 这个正则表达式应该匹配12m 100cm 1km忽略空白 尝试这个 0 1 9 d s da yzafpn mcdhkMGTPEZY m
  • 将带有分号分隔符的 CSV 导入 MongoDB 数据库

    我刚刚尝试将 CSV 文件 带有分号 分隔符 导入到 MongoDB 数据库中 我管理导入mongoimport d mydb c things type csv file files csv headerline但结果不是我所期望的 这些
  • 使用 gtsummary::tbl_regression 以科学计数法显示 p 值?

    非常感谢您的帮助 包括p values for gtsummary tbl regression函数于科学计数法 我正在使用大数据 显示 3 会非常有用p 值的小数点 gt 0 001 and p 值 一个有代表性的例子 load pack
  • 结构体与字符串文字?只读与读写? [复制]

    这个问题在这里已经有答案了 C99 标准是否允许写入复合文字 结构 它似乎不提供对文字字符串的写入 我问这个是因为它说C 编程 现代方法 第二版 http knking com books c2 index html第 406 页 问 允许
  • Vue.js 中 $set 的反义词是什么?

    在博客应用程序中 我想显示 隐藏每篇文章的评论在循环内 of posts 我知道如何通过设置来显示包含评论的divshowComments即时 this set post showComments true 但我不知道当 div 已经打开时
  • 詹金斯硒不无头运行测试

    我正在使用 jenkins 运行 pytests 硒测试 我在本地机器上进行了测试 它可以工作 但是当我运行 jenkins 时 它在远程 jenkins 机器上无头运行 在远程 jenkins 机器上创建工作区 并且失败并出现测试错误 例
  • 如何使用 NHibernate 将新对象添加到映射为一对多的 IList?

    我的模型包含一个类Section其中有一个有序列表Statics这是本节的一部分 忽略所有其他属性 模型的实现如下所示 public class Section public virtual int Id get private set p
  • Bootstrap 图像圆圈内阴影

    如何向引导 图像圆 添加内部阴影 jsfiddle http jsfiddle net 52VtD 1923 这不行 box shad box shadow 0 10px 20px 777 inset 0 0 200px 000 inset
  • 使用 API 在 OneDrive 上创建文件夹

    我尝试通过 API 在 OneDrive 上创建新文件夹 但出现异常 致命错误 未捕获的异常 League OAuth2 Client Provider Exception IdentityProviderException 消息为 必须提
  • “阻塞系统调用”是什么意思?

    阻塞系统调用 是什么意思 在我的操作系统课程中 我们正在学习多线程编程 当我在教科书中读到 当一个线程进行阻塞系统调用时 它可以允许另一个线程运行 时 我不确定这是什么意思 阻塞系统调用是必须等待操作完成的调用 read 将是一个很好的例子
  • 在 Java 中处理多个构造函数的最佳方法

    我一直想知道在 Java 中处理多个构造函数的最佳 即最干净 最安全 最有效 方法是什么 特别是当在一个或多个构造函数中未指定所有字段时 public class Book private String title private Stri
  • 弱链接的实际应用有哪些?

    使用特殊的编译器命令可以声明符号weak 根据维基百科 https en wikipedia org wiki Weak symbol 弱符号是目标文件或动态库中的符号定义 可能会被其他符号定义覆盖 什么场景或者什么应用需要弱符号 什么是典
  • 是否可以在 SASS mixin 中测试当前元素类型?

    我有一个 mixin 可以绘制这样的按钮 mixin button border 1px solid orange background orange padding 0 height 27px text transform upperca
  • Angular 2:让组件自动检测服务中的变量变化

    我目前面临的问题是 从功能上讲 当用户登录时 我的导航栏不会自动更新以向他们显示正确的链接 仅当我手动刷新不需要的页面时 它才会更新 因为这是单页面应用程序 我可以正常处理注销 因为注销按钮和功能位于控制导航栏的组件内 但是 登录是通过身份