Как отключить/включить actionItem без actionView в NativeScript Angular?

У меня есть ActionItem:

<ActionItem #finishActionItem text = "Finish" ios.position = "right" android.position = "actionBar" (tap) = "handleFinish()"></ActionItem>

Как отключить/включить actionItem? Я знаю, что это очень легко сделать изначально, но не могу понять, как это сделать в NativeScript angular.

Я пробовал использовать actionView, но actionView работает только с некоторым типом представления внутри actionItem. Мне не нужна метка внутри actionItem, потому что это требует, чтобы я сам ее стилизовал.

Как решить проблему?

Тестирование функциональных 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
0
0
556
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

NativeScript этого не поддерживает, но вы можете сделать это с помощью небольшого количества нативного кода.

Вставить Page в конструктор

import { Page } from "tns-core-modules/ui/page";

...

constructor(private page: Page) { }

Чтобы отключить finishActionItem в вашем коде,

if (this.page.actionBar.android) {
                const menu = this.page.actionBar.nativeView.getMenu();
                menu.findItem(this.finishActionItem.nativeElement._getItemId()).setEnabled(false);
            } else {
                const navigationItem = this.page.ios.navigationItem,
                    barButtonItems = this.finishActionItem.nativeElement.ios.position === "left" ? navigationItem.leftBarButtonItems : navigationItem.rightBarButtonItems;

                let barButtonItem;
                for (const item of barButtonItems) {
                    if (item.accessibilityLabel === this.finishActionItem.nativeElement.text) {
                        barButtonItem = item;
                        break;
                    }
                }

                if (barButtonItem) {
                    barButtonItem.enabled = false;
                }
            }

Именно то, что я искал! Большое спасибо!

Sam Conrad 29.07.2019 02:10

Мне пришлось изменить часть ios на: const barButtonItem = this.page.ios.navigationItem.rightBarButtonItem; если (barButtonItem) { barButtonItem.enabled = включено; }

Sam Conrad 29.07.2019 02:26

Я борюсь с той же проблемой. Я использую Nativescript/Angular и пытался реализовать вышеуказанное решение, однако код не может найти this.finishActionItem. Я вижу, что это идентификатор (#finishActionItem) элемента действия, но получаю красную волнистую линию и ошибку компиляции. Есть ли в этом решении что-то, что не показано выше? Мой ActionBar находится в моем app.component.html, поэтому он автоматически отображается на всех страницах для удобства и предотвращения избыточного кода. Но это отображается на моей целевой странице, и я пытаюсь скрыть некоторые узлы ActionItem только с целевой страницы.

Robert 03.05.2020 05:00

Сборка Webpack завершена! Проект успешно подготовлен (Android) tns-java-classes.js успешно перенесен на эмулятор устройства-5554. Успешно передан файл vendor.js на эмуляторе устройства-5554. Перезапуск приложения на эмуляторе устройства-5554... Успешно синхронизировано приложение org.nativescript.blankng на эмуляторе устройства-5554. JS: HMR: включена горячая замена модуля. Ожидание сигнала. JS: ОШИБКА TypeError: Не удается прочитать свойство «getMenu» неопределенного. Похоже, мне может не хватать библиотеки для объекта actionBar.nativeView? this.page.actionBar.nativeView.getMenu();

Robert 03.05.2020 06:52

Забыл добавить, что у меня есть код в моем методе ngOnInit() : void { ... }, и он находится в компоненте посадочного представления, а не в app.component.ts. В ответе выше не указано, куда поместить код.

Robert 03.05.2020 07:03

Ваши нативные элементы не будут готовы в ngOnInit. Рекомендуется использовать загруженные события View, чтобы обеспечить готовность собственных элементов.

Manoj 03.05.2020 07:09

@Manoj - Пробовал с ngAfterViewInit() : void {} и некоторыми другими, все та же ошибка. Возможно, мне придется прибегнуть к другому методу все вместе, потратил почти весь день на этот уже. Спасибо за вашу поддержку.

Robert 03.05.2020 07:28

Как я уже упоминал, используйте загруженное событие в корневом представлении или на странице.

Manoj 03.05.2020 07:56

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