Будет ли это хорошей идеей:
Недавно я задал вопрос о темах (позволяя пользователю выбирать тему и сразу же применять ее). Для этого у меня возникла идея использовать модели и привязку, и я воспользовался возможностью, чтобы, наконец, изучить. Я получил желаемый результат - создал тему и применил ее с помощью модели с привязкой данных, а в своем тестовом приложении сделал следующее:
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>
(В моем реальном приложении я использую реализацию кроссплатформенного элемента управления навигацией, поэтому я просто передам эту модель, когда открою окно в одном месте)
Очевидно, что такие действия создадут множество привязок практически для каждого элемента на странице. Я точно не знаю, что происходит за кулисами, но я предполагаю, что он создает слушателя для каждого такого привязанного значения, что приводит к множеству слушателей, большим накладным расходам и генерирует больше кода для страницы.
Думаю, я в значительной степени отвечаю на свой вопрос - рекомендуется ли продолжить исследование этого пути? Насколько это плохо?





Возможно использование классов и их повторное применение при изменении. Вам нужно отслеживать событие только в одном месте на каждом контроллере.
Вы можете взглянуть на пример, который я написал о динамическом стилизации на основе ориентации на GitHub.
Сделать это можно так:
".DynamicLabel[if=Alloy.Globals.isPortrait]": {}
Вы должны использовать события Backbone, которые также указаны в репозитории, на который я ссылался выше.
Alloy.js:
Alloy.Globals.events = _.clone(Backbone.Events);
Controller.js:
Alloy.Globals.events.on('orientationchange', () => {
Но: Это очень сложно и вносит сложности, которые вам не нужны. Часть событий я бы не рекомендовал для сложного приложения. Но .. это возможно!
Что я бы порекомендовал для сложного приложения, так это использовать фильтры if в tss и просто закрыть и снова открыть контроллеры, которые вы хотите изменить.
в случае Android, когда у меня есть такая функциональность, я всегда использую контроллер index в качестве основного (просто в нем ничего нет, но открывайте его). Таким образом, вы все еще можете закрыть свой «главный» контроллер, не выходя из приложения. В случае iOS откройте новое окно, прежде чем закрыть другое. Это должно работать нормально
Но тогда в Android, когда пользователь нажимает кнопку «Назад» в вашем «главном» окне (по крайней мере, в том, что является главным окном в его голове), он просто показывает пустую страницу.
Сделайте свое собственное главное окно «exitOnClose: true», и когда вы захотите закрыть его для повторного открытия, не забудьте установить для него значение false прямо перед его закрытием;)
Что, если один из контроллеров, который мне нужно будет закрыть и снова открыть (и я предполагаю, что это не только Window
close()иopen()), является главным окном? Это приведет к закрытию всего приложения, не так ли? Как правильно закрыть и снова открыть контроллер?