为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?

Posted

技术标签:

【中文标题】为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?【英文标题】:Why does the following code for switching the visibility of two containers not work and what is the correct way of doing it?为什么以下用于切换两个容器的可见性的代码不起作用,正确的做法是什么? 【发布时间】:2014-09-19 04:32:07 【问题描述】:

我正在尝试制作一个按钮,根据另一个框的状态使框可见或不可见。这是我的代码:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
               xmlns:s="library://ns.adobe.com/flex/spark"
               xmlns:mx="library://ns.adobe.com/flex/mx">

    <fx:Script>
        <![CDATA[
            public function switchContainers():void 
                if ((screen1.visible = false) && (screen2.visible = true)) 
                    screen2.visible = false;
                    screen2.includeInLayout = false;
                    screen1.visible = true;
                    screen1.includeInLayout = true;
                 else 
                    screen1.visible = false;
                    screen1.includeInLayout = false;
                    screen2.visible = true;
                    screen2.includeInLayout = true;
                
            
        ]]>
    </fx:Script>

    <s:SkinnableContainer id="screen1"   backgroundColor="red" visible="false" includeInLayout="false" />
    <s:SkinnableContainer id="screen2"    backgroundColor="blue" visible="true" includeInLayout="true" />
    <s:Button top="5" left="5" label="Switch containers" click="switchContainers()"/>

</s:Application>

每当我点击按钮时,什么都没有发生。我只能看到蓝色的容器。为什么这不起作用?

本练习的最终目的是在应用程序中显示不同的“屏幕”(登录屏幕、菜单屏幕等),而无需借助 ViewStack(我正在尝试仅使用 Spark 组件)。这样做的首选方式是什么?

【问题讨论】:

您忘记了函数中的参数 MouseEvent。 【参考方案1】:

在您的条件语句中,在评估屏幕的可见性时,您使用的是 assignment operator (=) 而不是 equality operator (==)。

if ((screen1.visible = false) && (screen2.visible = true)) 

将其更改为等式表达式:

if ((screen1.visible == false) && (screen2.visible == true)) 

实现此目的的另一种方法是使用 Flex 状态系统,您可以在其中定义 screen1screen2 的状态:

<s:states>
    <s:State name="screen1"/>
    <s:State name="screen2"/>
</s:states>

使用includeIn 属性来包含一个组件:

<s:SkinnableContainer id="screen1" includeIn="screen1" />
<s:SkinnableContainer id="screen2" includeIn="screen2" />

然后,使用changeState 属性更改状态:

currentState = "screen2";

【讨论】:

【参考方案2】:

在您的 if 条件中,您使用 operator =(赋值)为变量赋值,而不是使用 operator ==(相等)来测试两个表达式是否相等。你的条件应该这样写:

if ((screen1.visible == false) && (screen2.visible == true)) 

【讨论】:

谢谢!为什么事件触发的函数必须将事件作为参数,即使它不用于处理输出? @Laura - AS3 包含一个基于文档对象模型 (DOM) 级别 3 事件规范的新事件模型。这个新版本的 ActionScript 引入了一个单一的事件处理程序,它取代了该语言以前版本的各种机制。 很抱歉,但这是不正确的 - 只有在脚本块或传统类中编写时才是强制性的,您通过 addEventListener 直接分配侦听器。 mxml 是第 3 层抽象,编译器在其中获取您的代码并将其包装在自动生成的 AS 类中。在这种确切的情况下,如果您要查看 keep-generated,您会看到相当于: clickHander_194983105212 其中调用您的内部方法 - 因此传递参数是可选的。 @Mike Petty - 感谢您的精确。

以上是关于为啥以下用于切换两个容器的可见性的代码不起作用,正确的做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个用于 lat/long 的 Lua Haversine 代码不起作用?

CSS可见性动画不起作用

为啥这个切换按钮在颤振 - 飞镖中不起作用?

为啥切换屏幕在 kivy 中不起作用?

为啥这个宽度监视 AngularJS 指令在切换 Bootstrap 选项卡时不起作用?

如果我在函数顶部切换注释行的位置,为啥我的代码不起作用?这是一个记忆召回声明[关闭]