我想将指令中的变量连接到组件

Posted

技术标签:

【中文标题】我想将指令中的变量连接到组件【英文标题】:I want to connect a variable from a directive to a component 【发布时间】:2021-10-11 06:42:50 【问题描述】:

每个指令都有一个

// Modules and Components
import  Directive, Input, ElementRef, HostBinding, HostListener  from '@angular/core';
import  DomSanitizer, SafeStyle  from '@angular/platform-browser';

// Directive
import  DraggableDirective  from '../draggable/draggable.directive';

// Interfaces
import  Position  from '../../../../interfaces/draggable-system/move-position';

/**
 * Allows to move the objects.
 */

@Directive(
  selector: '[appMovable]'
)
export class MovableDirective extends DraggableDirective 

  // ********** DECLARATIONS **********//

  // Overview of the Inputs, Outputs and HostBindings
  @Input('appMovable') set movable(movable: boolean) 
    this.enabled = movable;
  

  @HostBinding('class.moving') moving = false;

  // Check the positions
  position: Position =  x: 0, y: 0 ;
  private startPosition: Position;
  private reset = false;

  constructor(
    public element: ElementRef,
    private sanitizer: DomSanitizer) 
    super();
  

  // Use HostBindings and HostListener

  @HostBinding('style.transform') get transform(): SafeStyle 
    return this.sanitizer.bypassSecurityTrustStyle(
      `translateX($this.position.xpx) translateY($this.position.ypx)`
    );
  

  @HostListener('dragStart', ['$event']) onDragStart(event: PointerEvent): void 
    this.moving = true;
    this.startPosition = 
      x: event.clientX - this.position.x,
      y: event.clientY - this.position.y
    ;
  

  @HostListener('dragMove', ['$event']) onDragMove(event: PointerEvent): void 
    this.position = 
      x: event.clientX - this.startPosition.x,
      y: event.clientY - this.startPosition.y,
    ;
  

  @HostListener('dragEnd') onDragEnd(): void 
    this.moving = false;

    if (this.reset) 
      this.position = 
        x: 0,
        y: 0,
      ;
    
  

我需要将此指令中的一个变量绑定到一个组件中。我该怎么做呢?该指令由在鼠标事件期间检测到 x 轴和 y 轴的事件组成。布尔变量可移动应该以某种方式识别。

【问题讨论】:

ERROR TypeError: Cannot read property 'moving' of undefined move 也是一个布尔变量,我需要连接到组件 【参考方案1】:

多种解决方案:

) 使用服务来存储全局变量,该变量将在调用 MovableDirective 时更新。为此,您需要在指令中注入您的服务。

) 或者你可以在你的指令中使用@Output 在你的组件中冒泡移动

export class MovableDirective extends DraggableDirective 
[...]
@Output()
eventToBubbleUp = new EventEmitter<boolean>();
[...]
onDragEnd() 
    [...]
    this.eventToBubbleUp.emit(movable);


你可以这样称呼它

  <div [...] appMovable (eventToBubbleUp)="toDo(movable)"></div > 

【讨论】:

还是不行。如果我制作 ,则作为 div 子元素的按钮消失。 这不是您使用输出方法的方式。 toDo(movable) 方法在您的组件内部,请查看angular.io/guide/… 了解更多信息。【参考方案2】:

如果你的指令导出为

@Directive(
  selector: '[appMovable]',
  exportAs: 'appMovable'
)

当您使用模板引用变量时,您可以指定“exportAs”并使用它(如果您愿意,您可以调用函数)

<div appMovable #d="appMovable">d.movable</div>

【讨论】:

以上是关于我想将指令中的变量连接到组件的主要内容,如果未能解决你的问题,请参考以下文章

如何将会话变量连接到 Django 中的登录用户?

清除按钮作为指令或角度 2-8 中的组件

如何将信号连接到不同线程中的插槽

反应本机连接到同一页面中的两个redux

无法连接到 IB 中的子视图

将 Lambda 连接到 AWS MSK 中的 kafka 主题的最经济有效的方法是啥?