【问题标题】:Appcelerator Titanium - Using Model as dynamic themeAppcelerator Titanium - 使用模型作为动态主题
【发布时间】:2018-07-09 03:10:33
【问题描述】:

这是个好主意吗:

我最近问了一个关于主题的问题(让用户选择一个主题并立即应用它)。为此,我想到了使用模型和绑定——我利用这个机会终于学会了。 我得到了想要的结果 - 创建一个主题并使用具有数据绑定的模型应用它,并在我的测试应用程序中执行了以下操作:

app.tss “标签”: { 背景颜色:“{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>

(在我的真实应用中,我使用的是跨平台导航控件的实现,所以当我在一个地方打开窗口时,我只会传递这个模型)

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

我猜我几乎是在回答我自己的问题 - 是否建议继续调查这条路径?这有多糟糕?

【问题讨论】:

    标签: titanium appcelerator appcelerator-titanium appcelerator-alloy


    【解决方案1】:

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

    你可以看看我在GitHub上写的关于基于方向的动态样式的例子

    你可以这样做:

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

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

    Alloy.js:

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

    Controller.js:

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

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

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

    【讨论】:

    • 如果我需要关闭并重新打开的控制器之一(我猜不仅仅是一个窗口close()open())是主窗口怎么办?它会导致整个应用程序退出,不是吗?关闭和重新打开控制器的正确方法是什么?
    • 如果是Android,当我拥有该功能时,我总是使用index 控制器作为主要控制器(里面什么都没有,但一定要打开它)。这样,您仍然可以在不退出应用程序的情况下关闭“主”控制器。如果是 iOS,请在关闭另一个窗口之前打开一个新窗口。那应该可以正常工作
    • 但是在 android 中,当用户按下“主”窗口上的后退按钮时(至少他心目中的主窗口是什么),它只会显示一个空白页面。
    • 让你自己的主窗口“exitOnClose: true”,当你想关闭它重新打开时,别忘了在关闭它之前将它设置为false;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    相关资源
    最近更新 更多