MatCheckbox preventDefault () и значение event.checked

Как я могу установить флажок Материал, чтобы он не отмечался / не снимался по умолчанию (например, при вызове preventDefault() в событии), а также получать значение checked из события?

Похоже, я могу выполнить только одно из условий. Используя событие (click), я не могу получить значение флажка, а с помощью события (change) я не могу предотвратить изменение значения флажка по умолчанию (я изменю значение флажка только в том случае, если базовый HTTP-запрос был успешным).

Stackblitz: https://stackblitz.com/edit/matcheckbox-checked

<mat-checkbox 
  [checked] = "checked"   
  (click) = "onClick($event)"
>onClick me!</mat-checkbox>

<br/>

<mat-checkbox 
  [checked] = "checked"
  (change) = "onChange($event); false"
>onChange me!</mat-checkbox>

export class CheckboxOverviewExample {
  checked: boolean = false;

  onClick(event) {
    event.preventDefault();
    console.info('onClick event.checked ' + event.checked);
    console.info('onClick event.target.checked '+event.target.checked);
  }

  onChange(event) {
    // can't event.preventDefault();
    console.info('onChange event.checked '+event.checked);
  }
}

Событие (click) печатает значения undefined, но успешно предотвращает распространение события, событие (change) печатает значение, но распространяет событие.

Связанные проблемы:

вы хотите отключить чекбокс?

Chellappan வ 17.09.2018 14:07

@Chellappan Нет, я хочу вручную изменить значение флажка (установлен или не установлен).

szab.kel 17.09.2018 14:13
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Angular и React для вашего проекта веб-разработки?
Angular и React для вашего проекта веб-разработки?
Когда дело доходит до веб-разработки, выбор правильного front-end фреймворка имеет решающее значение. Angular и React - два самых популярных...
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Эпизод 23/17: Twitter Space о будущем Angular, Tiny Conf
Мы провели Twitter Space, обсудив несколько проблем, связанных с последними дополнениями в Angular. Также прошла Angular Tiny Conf с 25 докладами.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
Мое недавнее углубление в Angular
Мое недавнее углубление в Angular
Недавно я провел некоторое время, изучая фреймворк Angular, и я хотел поделиться своим опытом со всеми вами. Как человек, который любит глубоко...
Освоение Observables и Subjects в Rxjs:
Освоение Observables и Subjects в Rxjs:
Давайте начнем с основ и постепенно перейдем к более продвинутым концепциям в RxJS в Angular
2
2
8 327
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Мы не можем контролировать поведение флажка и свойств события по умолчанию. Вы можете создать 2 значка изображения с отмеченным и непроверенным состоянием, переключать его в зависимости от значения.

Ответ принят как подходящий

Если вы хотите установить флажок вручную, @ViewChild получить ссылку на элемент, затем используйте флажок, чтобы установить значение true или false, как это

@ViewChild('ref') ref;

  onClick(bool){
    this.ref._checked=bool;
  }

Пример: https://stackblitz.com/edit/matcheckbox-checked-ybru81

Тот же пример при обработке события: https://stackblitz.com/edit/matcheckbox-checked-a1le6o

попробовать неопределенный

проверить
Переключить установленное значение флажка, игнорировать неопределенное значение. Если флажок находится в неопределенном состоянии, флажок будет отображаться как неопределенный флажок независимо от установленного значения.

чек-неопределенный
Поведение mat-checkbox по умолчанию. Всегда устанавливайте для неопределенного значения false, когда пользователь нажимает на поле mat-checkbox. Это соответствует поведению собственного "input type =" checkbox ""

https://material.angular.io/components/checkbox/overview#-code-check-code-

В моем личном случае мне нужно кодировать для мыши, а также для событий клавиатуры, если вам небезразлична доступность, о которой вы знаете :)

если вы нажмете «Пробел» с флажком «Все еще», поэтому (щелчка) недостаточно, вам также необходимо включить (нажатие клавиши). Не только это, но после того, как я исправил проблему с пробелом, я заметил, что он также блокирует вкладку, которая мне нужна для навигации с помощью клавиатуры, поэтому мне просто пришлось добавить небольшой код для этого

      <mat-checkbox [checked] = "descendantsAllSelected(node)" 
        [indeterminate] = "descendantsPartiallySelected(node)"
        (click) = "toggleDescendants(node,$event)"
        (keydown) = "toggleDescendants(node,$event)"
        >
        {{node.name}}
      </mat-checkbox>

В коде

  toggleDescendants(node, $event) {
    this._logger.debug('toggleDescendants()');
    this.treeControl.toggleDescendants(node);
    if ($event.code !== 'Tab') {
      $event.preventDefault();
    }
  }

Вы можете предотвратить действие по умолчанию при «изменении» с помощью поставщика в компоненте:

providers: [{
    provide: MAT_CHECKBOX_DEFAULT_OPTIONS, 
    useValue: { clickAction: 'noop' } as MatCheckboxDefaultOptions
}]

(источник: https://material.angular.io/components/checkbox/overview#noop)

и вы можете привязать проверенный к локальной переменной (или функции получения)

<mat-checkbox
(click) = "changeValue()"
[checked] = "theValue"
>
   Whatever
</mat-checkbox>

Итак, в коде, например, вы используете значение в качестве значения и устанавливаете это значение программно. Таким образом, вам не нужно получать состояние флажка в качестве параметра метода щелчка, вы можете получить к нему доступ из значения.

theValue: boolean = false;

changeValue(): void {
    this.theValue = !this.theValue
}

Другие вопросы по теме