我正在try 编写一些代码,允许我观察可滚动列表,我想判断列表的第一项是否可见,如果是do not,则使按钮可见,但如果第一项是隐藏的,则使按钮可见,因为它将是"滚动到顶部按钮".

我应该将指令添加到按钮还是列表中?我假设我将其添加到按钮,但我如何判断列表项是否已删除?

@Directive({
  selector: '[appInview]',
})
export class InviewDirective implements AfterViewInit {
  @Input() elementToWatch?: HTMLElement; // Button
  private observer?: IntersectionObserver;

  constructor(private el: ElementRef) {}
  ngAfterViewInit(): void {
    this.observer = new IntersectionObserver(
      (entries) => {
        if (entries[0].isIntersecting === true) {
          this.elementToWatch?.setAttribute('hidden', 'true');
        } else {
          this.elementToWatch?.removeAttribute('hidden');
        }
      },
      {
        threshold: 0.75,
      }
    );

    this.observer.observe(this.el.nativeElement as HTMLElement);
  }

  ngOnDestroy() {
    this.observer?.disconnect();
  }
}

推荐答案

这是预期的输出吗?我将指令附加到ngFor,并使用ngForfirst变量允许指令只对第一个元素起作用,然后代码开始正常工作!

Main TS

import { CommonModule } from '@angular/common';
import { Component } from '@angular/core';
import { bootstrapApplication } from '@angular/platform-browser';
import 'zone.js';
import { InviewDirective } from './in-view.指令';

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [CommonModule, InviewDirective],
  template: `
    <h2>Users</h2>
    <button #button style="position: fixed; left: 0px;top:0px;">just a button</button>

    <ul>
      <li *ngFor="let user of users;let first=first" [appInView]="first" [elementToWatch]="button">
        <h3>{{user.firstName}} {{user.lastName}}</h3>
        <ul>
          <li>Age:{{user.age}}</li>
          <li>Address - > {{user.address.city}} {{user.address.street}},{{user.address.state}}</li>
        </ul>
      </li>
    </ul>
  `,
})
export class App {
  users: any[] = [];
  constructor() {}

  ngOnInit() {
    this.users = [
      {
        firstName: 'Nasir',
        lastName: 'Shaik',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Jyothi Nager 5th Street',
        },
      },
      {
        firstName: 'Asif',
        lastName: 'Shaik',
        age: 27,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'vedayapalam 8th street',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
      {
        firstName: 'Kumar',
        lastName: 'Sitty',
        age: 28,
        address: {
          city: 'Nellore',
          state: 'AP',
          street: 'Chandramouli nagar',
        },
      },
    ];

    this.addUser({
      firstName: 'Krishna',
      lastName: 'lankha',
      age: 26,
      address: {
        city: 'Tirupathi',
        state: 'AP',
        street: 'udyagari colony',
      },
    });
  }

  addUser(users: any) {
    this.users.push(users);
  }
}

bootstrapApplication(App);

指令

import { Directive, ElementRef, Input, AfterViewInit } from '@angular/core';

@Directive({
  selector: '[appInView]',
  standalone: true,
})
export class InviewDirective implements AfterViewInit {
  @Input() elementToWatch?: HTMLElement; // Button
  @Input() appInView: boolean = false; // Button
  private observer?: IntersectionObserver;

  constructor(private el: ElementRef) {}
  ngAfterViewInit(): void {
    if (!this.appInView) return;
    this.observer = new IntersectionObserver(
      (entries) => {
        console.log(entries);
        if (entries[0].isIntersecting) {
          this.elementToWatch?.setAttribute('hidden', 'true');
        } else {
          this.elementToWatch?.removeAttribute('hidden');
        }
      },
      {
        threshold: 0.75,
      }
    );

    this.observer.observe(this.el.nativeElement as HTMLElement);
  }

  ngOnDestroy() {
    this.observer?.disconnect();
  }
}

stackblitz

Typescript相关问答推荐

如何将绑定到实例的类方法复制到类型脚本中的普通对象?

对于使用另一个对象键和值类型的对象使用TS Generics

在这种情况下,如何获得类型安全函数的返回值?

在TypeScript中使用泛型的灵活返回值类型

为什么typescript要把这个空合并转换成三元?

接口的额外属性作为同一接口的方法的参数类型'

为什么T[数字]不也返回UNDEFINED?

类型脚本返回的类型包含无意义的泛型类型名称

是否可以基于对象的S属性值[]约束对象的其他属性值用于类型化的对象数组?

如何在ANGLE中注册自定义验证器

如何从输入中删除值0

判断映射类型内的键值的条件类型

如果判断空值,则基本类型Gaurd不起作用

顶点堆叠的图表条形图未在正确的x轴上显示

可以将JS文件放在tsconfig';s includes/files属性?或者,我如何让tsc判断TS项目中的JS文件?

typescript如何从映射类型推断

我可以使用JsDocs来澄清Typescript实用程序类型吗?

将带有额外id属性的Rust struct 展平回TypeScript单个对象,以返回wasm-bindgen函数

元素隐式具有any类型,因为string类型的表达式不能用于索引类型{Categories: Element;管理员:元素; }'

当并非所有歧视值都已知时,如何缩小受歧视联盟的范围?