【问题标题】:Angular2 - ngclass on directive selectorAngular2 - 指令选择器上的 ngclass
【发布时间】:2016-07-20 07:10:37
【问题描述】:

我正在使用最新的 Angular 2 beta (45?) 并尝试将 ngClass 附加到指令选择器标识的元素。用于切换类的变量不会更新。

我怀疑这是两件事之一:

  1. Angular2 不能那样工作,所以这是一个范围问题;如果我 在指令选择器元素中放置一个 div 并附加 ngClass 到那个 div,它可以工作。不过我不想那样做。
  2. 因为我正在对窗口事件做出反应。我试过使用观察者, setTimeout 黑客和区域。不走运。

有没有办法做我想做的事?不再是这样了吗?

从内存中编写的示例代码,因为我目前无法访问它:

@Directive({
    selector: "nav",
    templateUrl: "templates/nav.html"
});

export class NavComponent {
    isOpen:Boolean = false;

    onScroll(e) {
        this.isOpen = true;
    }

    window.onscroll = (e) => this.onScroll.call(this);  // .call seemed necessary, because otherwise the scope of 'this' changed to window instead of the directive  
}

以下操作无效:

index.html

<nav [ngClass]="{open: isOpen}"></nav>

模板/nav.html

<a href="#">whatever</a>
...
<a href="#">whatever 2</a>

以下确实有效:

index.html

<nav></nav>

模板/nav.html

<div [ngClass]="{open: isOpen}">
    <a href="#">whatever</a>
    ...
    <a href="#">whatever 2</a>
</div>

【问题讨论】:

  • I'm using the latest Angular 2 beta (45?) 为笑点赞。
  • 哈哈,我知道是对的。介于 0 到 1000 之间。

标签: angularjs angularjs-directive angular


【解决方案1】:

isOpen

<nav [ngClass]="{open: isOpen}"></nav>

&lt;nav&gt;的父组件,即模板中包含&lt;nav&gt;的组件。

如果要在指令主机上设置类,请使用

@Directive({
    selector: "nav",
    templateUrl: "templates/nav.html",
    host: {'[class.open]': 'isOpen'}
});
export class NavComponent {
    isOpen:Boolean = false;

    onScroll(e) {
        this.isOpen = true;
    }
}

【讨论】:

  • 优秀。我敢打赌这会奏效。使用主机或通过子容器执行此类操作是否有任何性能优势?
  • 不,这就像ngClass,但绑定到指令/组件内部而不是外部的值。
【解决方案2】:

除了 Günter 的回答之外,使用 host listener 而不是将事件处理程序分配给 window.onscroll。然后 Angular 更改检测将运行并在您滚动时实际更新 CSS 类。 (否则,需要在视图更新之前发生一些其他事件。)

@Component({
    selector: "nav",
    template: `<a href="#">whatever</a>
      <a href="#">whatever 2</a>`,
    host: {
      '(window:scroll)': 'onScroll($event)',   //  <<------
      '[class.open]': 'isOpen'
    }
})
export class NavComponent {
  isOpen:Boolean = false;
  onScroll(e) {
    this.isOpen = true;
  }
}

@Component({
  selector: 'my-app',
  template: `<nav></nav>
    <div *ngFor="#row of dummyArray; #i = index">row {{i}}</div>`,
  styles: ['.open { background-color: lightblue }']
  directives: [NavComponent]
})
export class AppComponent {
  dummyArray = new Array(100);
  constructor() { console.clear(); }
}

Plunker

【讨论】:

  • 完美。一旦我想起了主机,我就想起了 hostListener 并完全按照您的建议进行操作。非常有帮助 - 谢谢。
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 2017-09-04
  • 1970-01-01
  • 2015-12-26
  • 2017-04-03
  • 2018-08-28
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多