代码之家  ›  专栏  ›  技术社区  ›  Anthony

无法选择角度中的绑定属性

  •  2
  • Anthony  · 技术社区  · 6 年前

    我有一个角度自定义进度条。我想订一个选择器 [value] . 但是,如果以角度绑定属性,则无法再进行选择。

    <progress-bar value="50"> 作品

    <progress-bar [value]="value">

    属性在第二种情况下不存在,它只是作为ng reflect-*属性之一存在。这是预期的行为吗?

    组成部分:

    ProgressBar {
        private currentValue;
        @Input() set value(value: number) { this.currentValue = value; }
        get value() { return this.currentValue; }
    ...
    }
    

    scss公司:

    progress-bar {
        display: block;
        height: 4px;
        width: 100%;
    
        // determinate
        &[value] {
            background: map_get($color-palette, progress-bar-background);
    
            .progress {
                height: 100%;
                background: map_get($color-palette, progress-bar-color);
    
                animation: none;
                transform-origin: top left;
                transition: transform 250ms ease;
            }
        }
    
        // indeterminate
        &:not([value]) {
            background: transparent;
        }
    }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   ConnorsFan    6 年前

    而不是 property binding ,您可以使用 attribute binding

    <progress-bar [attr.value]="value">
    
    export class ProgressBar {
    
      constructor(private elementRef: ElementRef<HTMLElement>) {}
    
      get value() {
        const element = this.elementRef.nativeElement;
        return element.getAttribute("value");
      }
    }
    

    this stackblitz 为了演示。


    一个简单的解决方案是在组件上有条件地设置一个类 HostBinding

    export class ProgressBar {
    
      private currentValue;
    
      @Input()
      get value() { return this.currentValue; }
      set value(value: number) { this.currentValue = value; }
    
      @HostBinding("class.has-value") get hasValue(): boolean {
        return !!this.currentValue;
      }
    }
    

    以及根据类选择器应用样式:

    progress-bar {
      ...
      &.has-value { 
        ...
      }
      &:not(.has-value) { 
        ...
      }
    }
    

    this stackblitz 为了演示。

        2
  •  0
  •   Calidus    6 年前

    您正在尝试在对象和方法之间使用单向属性绑定。删除getter和setter方法。它们有点没用,因为javascript没有真正的私有属性或方法。

    ProgressBar {
        @Input() public value: number
    ...
    }