如何在 Angular 2 中定义全局变量,以便我可以将它们用于模板中的属性绑定?

2024-01-23

在我的 Angular 2(beta 14)应用程序中,我需要跟踪用户登录状态以便隐藏/显示某些元素。

我遇到的问题是属性绑定没有按照我的方式工作,如下所示。

我创建了一个类来存储和更新全局变量:

应用程序全局.ts

 import {Injectable} from "angular2/core";

 @Injectable() export class AppGlobals {
   // use this property for property binding
   public isUserLoggedIn: boolean = false;

   setLoginStatus(isLoggedIn){
       this.isUserLoggedIn = isLoggedIn;
   }

   getLoginStatus(){
       return this.isUserLoggedIn;
   } }

在登录组件中我导入 AppGlobals

export class LoginComponent {
    constructor(private _appGlobals: AppGlobals) { }

并设置登录状态

this._appGlobals.setLoginStatus(true);

在另一个组件中,我像在 LoginComponent 中一样注入 AppGlobals

我定义了一个类(组件)的属性

isLoggedIn: boolean = this._appGlobals.isUserLoggedIn; // 我还尝试使用 getter 而不是公共属性(见上文)

然后我在组件的模板中使用它来显示/隐藏某个元素:

<!-- here I also tried with {{!isLoggedIn}} but results in a syntax error whereas using [(hidden)] instead of [hidden] changes nothing -->
<div id="some-element" [hidden] = "!isLoggedIn">

最后,绑定起作用了,但是没有更新(此组件是 AppComponent 模板的一部分,并显示在每个页面中)当另一个组件(例如 LoginComponent)设置登录状态时。

EDIT我尝试应用 Gunter 的答案,但出现以下错误:

app/app-globals.ts(10,54): error TS2346: Supplied parameters do not match any signature of call target.
app/app-globals.ts(13,29): error TS2339: Property 'emit' does not exist on type 'BehaviorSubject<boolean>'.

第 10 行的错误来自 [已解决]

公共 isUserLoggedIn:BehaviorSubject = new BehaviorSubject().startWith(false);

这显然是由BehaviorSubject期望引起的1个参数

第 13 行的错误来自

this.isUserLoggedIn.emit(isLoggedIn);

这显然是由不存在的emit method.

另外,我不明白如何使用 AppGlobals 以便属性绑定在另一个组件中自动更新(请参阅编辑之前的最后一个示例)

此外,在 LoginComponent 中,我将 isLoggedIn 布尔类型替换为行为主体因为 isUserLoggedIn 在 AppGlobals 中具有 BehaviourSubject 类型

but

this._appGlobals.isUserLoggedIn.subscribe(value => this.isLoggedIn = value);

返回类型错误:

指定的表达式类型 boolean 不可指定给BehaviorSubject 类型


isLoggedIn: boolean = this._appGlobals.isUserLoggedIn;

是一次性操作,在执行该行时复制值。如果您希望传播后续更改,请使用可观察量

import {Observable} from 'rxjs/Observable';
import 'rxjs/add/operator/share';
import 'rxjs/add/operator/startWith';
import {BehaviorSubject} from 'rxjs/BehaviorSubject';

@Injectable() 
export class AppGlobals {
// use this property for property binding
  public isUserLoggedIn:BehaviorSubject<boolean> = new BehaviorSubject<boolean>(false);

  setLoginStatus(isLoggedIn){
   this.isUserLoggedIn.next(isLoggedIn);
  }
}

并像这样使用它:

export class LoginComponent {
    constructor(private _appGlobals: AppGlobals) {
  this._appGlobals.isUserLoggedIn.subscribe(value => this.isLoggedIn = value);
}

也可以看看https://stackoverflow.com/a/35568924/217408 https://stackoverflow.com/a/35568924/217408

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

如何在 Angular 2 中定义全局变量,以便我可以将它们用于模板中的属性绑定? 的相关文章

  • 随机获取 zone.js 中超出最大调用堆栈大小

    我们正在使用 Bugsnag 我随机在日志中看到此错误 我们使用 Angular 6 1 1 并且使用启用了优化和构建优化的生产构建 使用当前最新版本的 zone js 0 8 26 我该如何调试这个 您必须找到一种方法来重现此错误 之后您
  • zone.js:140未捕获类型错误:无法读取属性“删除”

    我是 kendo ui 的新手 我在小提琴中开发了原型 删除确认窗口在那里工作正常 但是当我集成到我的代码库中时 我收到错误 Cannot read property remove at the line pai to delete rem
  • 该命令只能在 CLI 项目内部运行

    由于某些原因 我想使用Angular v5如果我运行以下命令 它会在其中构建一个应用程序angular 6这是我不想要的 ng new hello this creates angular app in the latest version
  • JavaFX 中的自定义双向绑定

    我正在尝试实现一个涉及 2 个字段计算的 GUI 我的模型有 2 个属性和 1 个绑定 ObjectProperty
  • Exceljs:迭代每行和每列的每个单元格

    我想在所有单元格中添加粗边框 这是一个有角度的项目 我正在使用打字稿 我可以为 1 个单元格做到这一点 worksheet getCell A1 border top style thick left style thick bottom
  • 将 Angular CLI 与 Squarespace 集成

    我很想知道是否有人能够在 Squarespace 站点中成功使用 Angular CLI 我一直在寻找这个问题的答案 但找不到解决方案 我知道您可以将自定义脚本添加到 Squarespace 站点和 或通过 CDN 添加脚本 但 Angul
  • Angular CLI - Typescript 抛出:无法读取未定义的属性“长度”

    我使用 ngserve 在 Angular 4 项目中运行 但出现错误 Cannot read property length of undefined 但我的项目中没有任何财产长度 完整的错误 Your global Angular CL
  • 如何在 Angular 2 项目中使用 Bower 组件

    我是 Angular 2 的初学者 Angular 2 项目使用 npm 包 我们可以通过简单地导入来在 Angular 2 项目中使用它们 如下所示 import FormsModule from angular forms 另外 我们可
  • Angular2 本地组件/模板重用

    我正在编写一些 Angular2 模板 这些模板具有不同容器的重复部分 在这种情况下 如果对事物进行分组并且启用了多部分模式 则视图可能会发生变化 请原谅这个很长的例子 但是像这样
  • Angular 4:Bootstrap 的折叠无法使用 data-target 属性

    我对 Angular 4 使用 Angular CLI 还是个新手 我不知何故无法完成简单的 Bootstrap Collapse 工作 以下是我的崩溃代码 div class panel panel default div class p
  • 在 Ionic 2 中从一个组件到另一个组件的动画过渡

    我的应用程序中有两个组件 我需要为这些页面之间的过渡设置动画 我需要翻动第 1 页 然后第 2 页就会出现 我有任何插件可以在 ionic 2 中执行此操作 任何参考 示例将不胜感激 我在用this navController setRoo
  • 绑定到内部 ViewModel-Property

    我有一个 UserControl 其 ViewModel 类作为 DataContext XAML
  • viewChild如何获取Angular2中添加了js的元素?

    如果一个 HTML 元素已添加到 DOM 中 例如单击按钮后 我们如何访问该元素 viewChild 看不到它 更新1 更多说明 我用过 jquery 数据表 jquery dataTablesdefineTyped 版本 https gi
  • “mat-card” 不是 Angular 7 中的已知元素

    我看到了很多关于此的问题 但似乎与我遇到的问题不同 我刚刚创建了我的第二个角度项目 我下面有一个新组件src app employees我试图在employees component html 中使用 我收到的错误是 Uncaught Er
  • 如何在cypress测试中实现拖放?

    我正在努力测试拖放Cypress https www cypress io and 角度材质拖放 https material angular io cdk drag drop overview 因此 我们的目标是将 开始工作 从 待办事项
  • 在单个 WPF 控件中列出所有 Validation.Error?

    我试图找到一种简单的方法来绑定单个控件 例如 TextBlock 或 ListBox 以列出 WPF 表单上的所有验证错误 我能找到的大多数源代码示例只是将一个控件绑定到 Validation Errors 0 ErrorContent 它
  • Angular 6 HTTP 客户端发布 - 错误请求

    我有以下问题 我有一个 API 所在的服务器 我将请求发送到注册端点 但作为响应 我收到 400 错误请求错误 指出必须填写姓名 电子邮件等 问题是它们已经满了 我不再怀念创意了 我的代码 import Component from ang
  • 从 Angular 6 服务中绑定图像

    我有一个端点 它根据某些参数为我提供图像 这不是一个图像网址 而是一个普通图像 因此 当我到达邮递员中的端点时 作为响应 我收到一张图像 JPG 我是否可以在变量中接收该图像并将其绑定到 HTML 标签中 所有问题都有将图像 url 映射到
  • 模拟 ngrx/store

    这是关于 Angular 2 官方版本的 我知道单元测试在 beta RC 和正式版本之间发生了巨大的变化 当 ngrx store 用作构造函数中的参数时 在单元测试中模拟 ngrx store 的好方法是什么 这并不像嘲笑服务那么简单
  • html输入数字,min + step,使step忽略min?

    是否有可能使step忽略min属性

随机推荐

  • 我可以在界面生成器中为 NSTextField 的文本添加下划线吗?

    我可以在界面生成器中为 NSTextField 的文本添加下划线吗 到目前为止 我只能改变它的颜色 有没有办法加下划线 thanks 仅适用于 iOS 是的 设置属性文本 然后选择文本 单击鼠标右键 gt 字体 gt 下划线
  • 如何将两个过程合二为一?

    只是想知道是否有一种语法快捷方式可以获取两个过程并将它们连接起来 以便将一个过程的输出传递给另一个过程 相当于 a gt x x 1 b gt x x 10 c gt x b a x 当处理诸如此类的事情时 这会派上用场method abc
  • mysql tinyint(2) 与学说的布尔值映射不正确

    我使用 symfony2 和命令对数据库进行了逆向工程 php app console doctrine mapping convert php app console doctrine mapping import php app con
  • Android:setContentView() == getViewInflate().inflate()?

    我尽我最大的努力想出一种巧妙的方法来清理成堆的东西Blah blah Blah this findViewById R id blah 否则会污染我的小 Activity 的字段和 onCreate 方法 为此 我觉得我不应该对 XML 中
  • 当模块同名时导入 python 包

    我有一个模块blah time我在正常时间和日期操作周围进行一些健全性检查和包装函数 import time def sleep n time sleep n 当我打电话时sleep 它只会抛出最大递归错误 我猜命名空间是错误的 所以我尝试
  • HAVING 子句后面可以有 WHERE 子句吗?

    是否可以在 HAVING 子句后使用 WHERE 子句 我首先想到的是子查询 但我不确定 附 如果答案是肯定的 您能举一些例子吗 不 不在同一个查询中 The where子句位于having和group by 如果您想在分组之前过滤掉记录
  • 如何添加窗口消息事件监听器-Android WebView

    如何添加事件监听器来处理window message事件在一个WebView 我试过这个 webView evaluateJavascript window addEventListener message function e Andro
  • 如何获取 jinja2 模板中所有变量的列表

    我正在尝试获取模板中所有变量和块的列表 我不想创建自己的解析器来查找变量 我尝试使用以下代码片段 from jinja2 import Environment PackageLoader env Environment loader Pac
  • 我应该开发什么最低的 BlackBerry 操作系统?

    我正在为 BlackBerry 移动设备开发 Netflix 应用程序 我需要决定我应该开发的最低操作系统版本 取决于我选择的版本会产生一些设计影响 例如我可以使用哪些浏览器字段类等 归根结底是 我应该支持低于 OS 5 0 的版本吗 我会
  • 如何确定我使用哪个 GC?

    我没有指定任何GC 我认为我的JVM默认没有启用任何GC 当然我知道OpenJDK8默认使用ParallelGC 但我认为它应该可以通过命令行打印 如下所示 java XX PrintFlagsFinal grep Use grep GC
  • GCC循环展开标志真的有效吗?

    在C中 我有一个任务 我必须用以下方法进行乘法 反转 转置 加法等 huge矩阵分配为二维数组 数组的数组 我找到了 gcc 标志 funroll all loops 如果我理解正确 这将自动展开所有循环 而无需程序员做任何努力 我的问题
  • jQuery - 单击链接时将光标置于输入字段中

    我想在单击特定链接后将光标放在输入字段中 我将其用于小型搜索引擎 想象一个输入字段 然后一些链接在输入字段中添加一个字符串 例如 丹麦 英格兰等 现在我需要将光标放置在这样的位置 丹麦 此处 这可能吗 更新 我现在正在使用此代码来替换文本
  • 如何在应用程序运行之间本地检测用户的 iPhone 时钟进度?

    休闲游戏中的一个常见漏洞是人为地提前系统时钟以在游戏中向前跳跃 iOS 设备上的应用程序如何检测此类用户时钟提前 不得涉及网络通信 当时钟提前时 不得假设应用程序已打开 运行或暂停 必须检测时钟前进 仅检测时钟回滚是不够的 理想情况下 该解
  • 有没有办法在 Nuxt.js 中使用 sass 而不是 node-sass (sass-loader 的默认值)?

    我正在尝试在 Nuxt js 中使用 sass 包而不是 node sass 我找到了这样的配置 vue config js module exports css loaderOptions sass implementation requ
  • getUserMedia() 权限被拒绝

    我正在尝试使用测试屏幕共享getUserMedia 我有 Chrome 版本 28 和getUserMedia 屏幕捕获标志已启用 但我仍然收到权限被拒绝的错误 On this 屏幕截图演示 http simpl info screenca
  • 如何以声明方式将禁用/选中等伪布尔属性绑定到布尔值?

    有没有一种简单的方法来绑定属性 例如disabled or checked真 假属性 就像是
  • JavaScript(初级)Kata - 使用函数构建计算器

    我正在解决以下类型 编写一个程序 将 sum product mean 或 sqrt 中的一个作为第一个参数 并使用一系列数字作为进一步的参数 该程序将适当的函数应用于该系列 我已经解决了它 下面的代码 但它体积庞大且效率低下 我想重写它
  • Spark将列转换为存储在字符串中的sql类型

    简单的请求是我需要帮助将列添加到数据帧 但是该列必须为空 其类型来自 spark sql types 并且必须从字符串定义类型 我可能可以用 ifs 或 case 来做到这一点 但我正在寻找更优雅的东西 不需要为 org apache sp
  • Angular 客户端启用 CORS

    CORS 在服务器上运行良好并且按预期工作 我尝试使用 Angular HTTPClient 向服务器的 REST API 发送请求 但收到 CORS 错误 如果服务器上启用了 CORS 为什么会出现此错误 客户端不是应该没问题吗 Cros
  • 如何在 Angular 2 中定义全局变量,以便我可以将它们用于模板中的属性绑定?

    在我的 Angular 2 beta 14 应用程序中 我需要跟踪用户登录状态以便隐藏 显示某些元素 我遇到的问题是属性绑定没有按照我的方式工作 如下所示 我创建了一个类来存储和更新全局变量 应用程序全局 ts import Injecta