Appcelerator Titanium - использование модели в качестве динамической темы

Будет ли это хорошей идеей:

Недавно я задал вопрос о темах (позволяя пользователю выбирать тему и сразу же применять ее). Для этого у меня возникла идея использовать модели и привязку, и я воспользовался возможностью, чтобы, наконец, изучить. Я получил желаемый результат - создал тему и применил ее с помощью модели с привязкой данных, а в своем тестовом приложении сделал следующее:

app.tss "Этикетка": { backgroundColor: "{theme.backgroundColor}" }

(конечно, в реальном приложении будет гораздо больше определений и привязок.

Для этого необходимо, чтобы я включал свою модель на каждую подобную страницу (index.xml):

<Alloy>
    <Model src = "theme" />

    <Window class = "container" layout = "vertical">
        <View
            id = "test"
            width = "150"
            height = "150"
            top = "10">
        </View>

        <Label id = "label" onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>
        <Label onClick = "doClick" top = "10">Hello, World</Label>

    </Window>
</Alloy>

(В моем реальном приложении я использую реализацию кроссплатформенного элемента управления навигацией, поэтому я просто передам эту модель, когда открою окно в одном месте)

Очевидно, что такие действия создадут множество привязок практически для каждого элемента на странице. Я точно не знаю, что происходит за кулисами, но я предполагаю, что он создает слушателя для каждого такого привязанного значения, что приводит к множеству слушателей, большим накладным расходам и генерирует больше кода для страницы.

Думаю, я в значительной степени отвечаю на свой вопрос - рекомендуется ли продолжить исследование этого пути? Насколько это плохо?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
37
1

Ответы 1

Возможно использование классов и их повторное применение при изменении. Вам нужно отслеживать событие только в одном месте на каждом контроллере.

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

Сделать это можно так:

".DynamicLabel[if=Alloy.Globals.isPortrait]": {}

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

Alloy.js:

Alloy.Globals.events = _.clone(Backbone.Events);

Controller.js:

Alloy.Globals.events.on('orientationchange', () => {

Но: Это очень сложно и вносит сложности, которые вам не нужны. Часть событий я бы не рекомендовал для сложного приложения. Но .. это возможно!

Что я бы порекомендовал для сложного приложения, так это использовать фильтры if в tss и просто закрыть и снова открыть контроллеры, которые вы хотите изменить.

Что, если один из контроллеров, который мне нужно будет закрыть и снова открыть (и я предполагаю, что это не только Window close() и open()), является главным окном? Это приведет к закрытию всего приложения, не так ли? Как правильно закрыть и снова открыть контроллер?

developer82 09.07.2018 11:18

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

Rene Pot 09.07.2018 11:20

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

developer82 09.07.2018 11:25

Сделайте свое собственное главное окно «exitOnClose: true», и когда вы захотите закрыть его для повторного открытия, не забудьте установить для него значение false прямо перед его закрытием;)

Rene Pot 09.07.2018 11:30

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