Appcelerator Titanium-使用模型作为动态主题

时间:2018-07-09 03:10:33

标签: titanium appcelerator appcelerator-titanium appcelerator-alloy

这是个好主意吗?

我最近问了一个有关主题的问题(让用户选择一个主题并立即应用它)。为此,我想到了使用模型和绑定的方法-借此机会我终于学习了。 我得到了理想的结果-创建一个主题并使用带有数据绑定的模型来应用它,并且在我的测试应用中,我做了以下事情:

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>

(在我的真实应用中,我正在使用跨平台导航控件的实现,因此当我在一个地方打开窗口时,我只会通过此模型)

显然,这样做会为页面上几乎每个元素创建许多绑定。我不完全了解幕后情况,但是我猜测它会为每个这样的绑定值创建一个侦听器-这会导致许多侦听器,大量开销并为页面生成更多代码。

猜猜我正在回答我自己的问题-建议您继续研究此路径吗?这有多糟?

1 个答案:

答案 0 :(得分:0)

可以使用类,并在更改时重新应用它们。您只需在每个控制器的一个位置监视事件

您可以看一下我写的有关基于GitHub的方向的动态样式的示例

您可以这样做:

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

您应该使用Backbone事件,就像我在上面链接的存储库中指定的一样。

Alloy.js:

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

Controller.js:

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

但是:这非常复杂,并引入了您不需要的复杂性。对于复杂的应用程序,我不建议使用事件部分。但是..有可能!

对于复杂的应用程序,我建议使用if中的tss过滤器,然后关闭并重新打开要重新设置样式的控制器。