首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular 6使用ViewChild

Angular 6使用ViewChild
EN

Stack Overflow用户
提问于 2018-12-05 15:21:13
回答 4查看 1.2K关注 0票数 2

我怎么能有两个功能相同的按钮来切换,但是这两个按钮都在不同的组件中?

下面是m_quick_sidebar_toggle的调用方式

代码语言:javascript
复制
import { Directive, ElementRef, OnDestroy, AfterViewInit } from '@angular/core';
import { $ } from 'protractor';

   @Directive({
       selector: '[mQuickSidebarOffcanvas]'
      })
   export class QuickSidebarOffcanvasDirective
    implements AfterViewInit, OnDestroy {
       constructor(private el: ElementRef) {}

ngAfterViewInit(): void {
    const offcanvas = new mOffcanvas(this.el.nativeElement, {
        overlay: true,
        baseClass: 'm-quick-sidebar',
        closeBy: 'm_quick_sidebar_close',
        toggleBy: 'm_quick_sidebar_toggle'
    });
}
ngOnDestroy(): void {}

}

EN

回答 4

Stack Overflow用户

发布于 2018-12-05 15:32:17

您可以使用subjectrxjs中的BehaviorSubject来完成此操作。

想象一下有三个组件:接收数据的主要组件。发送数据的左侧和右侧。这是结构。

服务:

代码语言:javascript
复制
@Injectable()
export class CommonService{
  private data$ = new Subject<any>();
  public dataEvent = this.data$.asObservable();

  public setData(data){
    this.data$.next(data);
  }
}

左侧组件

代码语言:javascript
复制
export class LeftComponent{
  constructor(
    private service: CommonService
  ) { }

  sendData(){
    this.commonService.setData("my data from left component");
  }
}

左侧组件html

代码语言:javascript
复制
<span (click)="sendData()"> Send data</span>

右分量

代码语言:javascript
复制
export class RightComponent{
  constructor(
    private service: CommonService
  ) { }

  sendData(){
    this.commonService.setData("my data from right component");
  }
}

右组件html

代码语言:javascript
复制
<span (click)="sendData()"> Send data</span>

主要组件

代码语言:javascript
复制
export class MainComponent{
  public data= "";
  constructor(
    private service: CommonService
  ) { 
      this.service.dataEvent
      .subscribe(res => {
        this.data = res;
      });
    }
}

右组件html

代码语言:javascript
复制
<p>Data sent from components : {{data}}</p>

工作堆栈闪电战:https://stackblitz.com/edit/angular-vts7zd?file=src%2Fapp%2Ftest.component.ts

票数 1
EN

Stack Overflow用户

发布于 2018-12-05 15:53:56

方法1

如果您的应用程序很小,那么您可以通过全局服务中的标志进行管理。

//服务

代码语言:javascript
复制
@Injectable()
export class ToggleService {
    private _toggleFlag: boolean = false;

    public get isVisible(){
        return this._toggleFlag;
    }

    public toggle() {
        this._toggleFlag = !this._toggleFlag;
    }
}

让"toggleService“为服务"ToggleService".的注入实例名称

//切换按钮代码

代码语言:javascript
复制
<button (click)="toggleService.toggle()">Toggle</button>

//消息按钮代码

代码语言:javascript
复制
<button *ngIf="toggleService.isVisible">Messages (10)</button>

方法2

如果你的应用程序太大,并且有很多类似的依赖项,那么上面的代码会让你的代码变得混乱。在这种情况下,您可以使用"ngRX“状态管理。关于这一点,您可以参考以下链接。

https://angular-2-training-book.rangle.io/handout/state-management/ngrx/

https://blog.nrwl.io/using-ngrx-4-to-manage-state-in-angular-applications-64e7a1f84b7b

票数 1
EN

Stack Overflow用户

发布于 2018-12-05 15:29:20

创建一个对所有组件都通用的全局服务。当点击按钮时,检查全局标志值并在按钮功能之间切换。

代码语言:javascript
复制
someFunction(){
    if(this.global.flag){
        this.global.flag = false;
        console.log('do something')
    }
    else{
        this.global.flag = true;
        console.log('toggle the functionality');
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53627120

复制
相关文章

相似问题

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