【问题标题】:RxJS applying changes for elements one by oneRxJS 对元素一一应用更改
【发布时间】:2018-12-18 16:40:53
【问题描述】:

我需要帮助 :) 我试图在其他主题中找到解决方案,但无法找到,所以如果有任何问题,我很抱歉。我是新手。
所以,问题。我有一堆div。我需要为每个 div 添加“活动”类,然后在 2 秒内将其删除。
我有解决方案,但我的主人说“从”然后“的”一点都不好。任何想法如何以其他方式完成?先感谢您!

const boxes = document.querySelectorAll('.box')
const innerBoxes = Array.from(boxes);
const clickOnDiv = fromEvent(innerBoxes, 'click')
   .pipe(
     map(event => {
       let notActiveElements = [];
       for ( let i=0; i < innerBoxes.length; i++) {
         if(innerBoxes[i] != event.target) {
           notActiveElements.push(innerBoxes[i])
         }
       }
       return notActiveElements
     }),
     concatMap(element => from(element)
      .pipe(
        concatMap(element => of(element)
        .pipe(
          tap(el => console.log(el)),
          delay(2000)
        )),
        tap(item => {
          item.classList.add('active')
        }),
        delay(2000),
        tap(item => {
          item.classList.remove('active')
        })        
      ))
   )

clickOnDiv.subscribe()

【问题讨论】:

  • innerBoxes 是 EVENTS 还是 HTML 元素?
  • 而不是fromEvent使用from。
  • innerBoxes - 来自盒子的数组,分配给 div 的类。只是为了更容易循环。所以基本事件是点击,抱歉没有马上说。所以,点击一个 div - 它应该是非活动的,其他的应该是活动的类。在获得非活动元素后 - 我正在使用 notActiveElements 数组

标签: rxjs observable rxjs-lettable-operators


【解决方案1】:

不确定条件是否“然后在 2 秒内将其一一移除”。不会阻止您遍历数组

   click$.pipe(
      filter(notActive),
      tap((elements) => elements.forEach(addActiveClass)),
      delay(2000),
      tap((elements) => elements.forEach(removeActiveClass))
    ).subscribe();

如果你不能那么

click$.pipe(
    filter(...)
    mergeMap(elements => from(elements)),
    tap(addActiveClass)
    delay(2000)
    tap(removeActiveClass)
).subscribe()

额外:

用户filter

 let notActiveElements = [];
   for ( let i=0; i < innerBoxes.length; i++) {
     if(innerBoxes[i] != event.target) {
       notActiveElements.push(innerBoxes[i])
     }
   }
   return notActiveElements;

喜欢: notActiveElements = innerBoxes.filter(box =&gt; box !== event.target);

更新,基于 cmets

 click$.pipe(
    filter(...)
    concatMap(elements => from(elements).pipe(
        tap(addActiveClass),
        delay(2000),
        tap(removeActiveClass)
    ))
).subscribe()

你在哪里学习rxjs

【讨论】:

  • 感谢您的回答。此解决方案一次添加/删除所有元素(div)的类,因此它为所有 div 添加活动类,然后同时删除所有元素的类。这个解决方案对我没有帮助。问题在于为每个 div 一个一个地添加/删除类。基本上,该类应该添加 1 个 div - 然后在 2 秒内删除,然后才应该将其添加到下一个 div 并继续前进。并感谢您的过滤:)
  • 我完成了课程,现在我是一家小公司的实习生,准备使用 Angular。它对你有用吗?我在 StackBlitz 中对其进行了测试,它仍然执行相同的操作 - 只需为所有 div 添加类,然后也将其删除。不一一。过滤后我把这个concatMap(elements =&gt; from(elements) .pipe( tap(item =&gt; { item.classList.add('active') }), delay(2000), tap(item =&gt; { item.classList.remove('active') }) ))
猜你喜欢
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 2011-12-11
  • 2012-02-25
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
  • 2018-10-21
相关资源
最近更新 更多