Angular prevent默认的奇怪行为

Angular preventDefault strange behaviour

提问人:Iceneo 提问时间:9/29/2023 更新时间:9/29/2023 访问量:44

问:

在我的项目中,我使用的是 ngx-context 库,它只显示菜单,但是,当单击其中的某个位置时,它会关闭。这就是为什么我决定使用 event.preventDefault() + event.stopPropagation() 来修复它,但由于某种原因,它的工作方式与我预期的不同

正如您在下面的代码中看到的,我在单击包裹在 mat-checkbox 周围的 div 时调用了 selectPositioningType()。

      <div style="width: 105%; padding: 0; margin: 0; display: flex; justify-content: center;gap: 5px"
           (click) = "selectPositioningType(positioningType, $event)">
        <mat-checkbox
          [checked] = "positioningType.ID === uwbTagsPositioningOptions.PositioningTypeID"
          [disabled] = "positioningType.ID === DRTLSPositioningTypeID">
        </mat-checkbox>
        <span>{{positioningType.Name}}</span>
      </div>

在这个函数中,我正在调用event.preventDefault()。我希望由于冒泡 event.preventDefault() 只会影响 div,但是,当我通过准确单击它来切换 mat-checkbox 时,即使在这种情况下没有调用 selectPositioningType,它也不会改变它的状态。只是好奇有什么解释,冒泡不应该从下到上吗?

顺便说一句,使用经典 html input[type=checkbox] 时情况是一样的

  selectPositioningType(positioningType: TagPositioningType, event: Event) {
    event.preventDefault();
    event.stopPropagation();
    if (positioningType.ID === this.DRTLSPositioningTypeID) {
      return;
    }
    this.uwbTagsPositioningOptions = {PositioningTypeID: positioningType.ID, UwbGatewayID: null};
    localStorage.setItem('savedTagPositioningType', JSON.stringify(this.uwbTagsPositioningOptions));
}
JavaScript Angular 事件 事件处理

评论

0赞 pcalkins 9/29/2023
它从复选框冒泡到 div,在那里你停止它。
0赞 pcalkins 9/29/2023
selectPositioningType 仍将在单击事件冒泡到 div 时被调用。
0赞 Iceneo 9/29/2023
@pcalkins是的,明白了,顺便说一句,如果我在 checkboxParent 中放置一个 checkboxChildren 并单击 checkboxChildren,在它的处理程序中我将调用 event.preventDefault(),它会阻止两个复选框被选中吗?
0赞 pcalkins 9/29/2023
不熟悉垫子的东西......但我认为你不能将一个输入嵌套在另一个输入中。如果这些是 div,preventDefault 只是阻止没有的默认事件......您正在调用 stopPropagation,它阻止了冒泡。复选框(输入元素)上的 preventDefault 将阻止选中该框。不过,您仍然可以显式处理 click 事件。(您的点击处理程序仍将被调用...

答: 暂无答案