首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >@HostBinding禁用子组件Angular 4中的类

@HostBinding禁用子组件Angular 4中的类
EN

Stack Overflow用户
提问于 2017-11-15 23:47:56
回答 4查看 2.7K关注 0票数 0

我有一个角应用程序,其中有用户登录和注销。在用户登录之前,我会显示一个欢迎页面作为主页。我只想在欢迎页面上启用背景图像。一旦用户登录,背景图像必须消失。当用户注销时,他将被重定向到欢迎页面,该页面必须再次显示背景图像。

我尝试在app.component.ts中使用@HostBinding,将选择器重命名为“body”。

代码语言:javascript
复制
app.component.ts

import {Component, HostBinding, Input} from '@angular/core';
import {InputMask} from "primeng/primeng";

@Component({
  selector: 'body',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css']
})
export class AppComponent {
  path = '../assets/img/AvayaHome.jpg';
  title = 'app';
  toggleClass = true;
  @HostBinding('class.bodyClass') isWelcomePage = this.toggleClass;
}

这是我的CSS。

代码语言:javascript
复制
app.component.css

.bodyClass  {
    background-image: url("../assets/img/AvayaHome.jpg");
}

这是我的index.html

代码语言:javascript
复制
<!doctype html>
<html lang="en">
<head>
 <title> Something </title>
</head>
<body class="bodyClass">

    <app-welcome-page></app-welcome-page>

</body>
</html>

我通过将toggleClass赋值为true来启用bodyClass的css样式。一旦用户登录,我就会更改子组件中的toggleClass (在app.component.ts中)的值。

这是我的login.component.ts

代码语言:javascript
复制
onLogin() {
    console.log('onLogin() invoked:', this._email, ':' , this.password);
    if (this._email == null || this.password == null) {
      this.errorMessage = 'All fields are required';
      return;
    }
    this.errorMessage = null;
    this.loginservice.authenticate(this._email, this.password);
    this.appComponent.toggleClass = true;
    this.router.navigate(['/dashboard']);
  }

当用户登录为FALSE时,toggleClass的值会更改。但我仍然可以看到背景图像。不确定我做错了什么。任何帮助都将不胜感激。

EN

回答 4

Stack Overflow用户

发布于 2017-11-16 12:33:05

作为一个例子,让我们看一下下面的代码:

代码语言:javascript
复制
var toggleClass = false;
var isWelcomePage = toggleClass;

console.log(isWelcomePage); // prints true

酷,一切都像预期的那样工作。

十秒钟后……

一些用户登录:

代码语言:javascript
复制
toggleClass = true;

console.log(isWelcomePage); // prints false

为什么它没有改变?

如果你打开任何关于javascript的文档或书籍,你可以读到一条主要规则:

基元始终是不可变的。

当我们使用=将toggleClass变量赋给isWelcomePage变量时,我们会将值复制到新变量中,因为基元是按值复制的。

解决方案1:

直接更改isWelcomePage属性

代码语言:javascript
复制
onLogin() {
  ...
  this.appComponent.isWelcomePage = true;
  ...
}

解决方案2

定义getter

代码语言:javascript
复制
@HostBinding('class.bodyClass')
get isWelcomePage() {
  return this.toggleClass;
}
票数 1
EN

Stack Overflow用户

发布于 2017-11-16 00:00:39

如果想要动态显示和隐藏背景,则应使用带有ngClass的条件类

你可以在这里阅读更多信息NgClass

在您的情况下,它将是

代码语言:javascript
复制
<div [ngClass]="{'bodyClass': isWelcomePage}">    
    ...
</div>

那么bodyClass css类将仅在 isWelcomePagetrue时应用,如果为false,则不会应用,图像也不会显示。

编辑:

按照要求,一个工作示例:Plunkr

票数 0
EN

Stack Overflow用户

发布于 2017-11-16 00:52:22

用if和else做一个函数;

代码语言:javascript
复制
if (user is login) {
  document.body.classList.add('bodyClass');
} else {
  document.body.classList.remove('bodyClass');
}

然后在需要时调用该函数,如logInlogOut

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47311692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档