gpt4 book ai didi

apache-flex - AS3/Flex 4 : Most Practical Way To Find Nested Children

转载 作者:行者123 更新时间:2023-12-02 20:29:58 24 4
gpt4 key购买 nike

我有点一头扎进一些 Flex/AIR 的东西中。我对 AS3 有相当扎实的背景,但考虑到 Flex 固有的层次结构复杂性(与常规 Flash 相比),我遇到了一个问题。

假设您有一个应用程序,其中几乎所有内容都是事件驱动的(常见)。访问事件目标附近的元素或事件目标本身是微不足道的。然而,我试图找到最实用(读:最好、最有效)的方法来找到远离当前上下文的 child 。

我知道有像 getChildAt()getChildByName() 这样的函数,但这假设有一个父上下文;如果您要查找的元素 (Flex) 是多个父级元素,在一个兄弟元素中,然后是多个子级元素,该怎么办?我们认为像 jQuery 这样的东西很容易做到这一点,但显然我们在 AS3 中没有那么奢侈。

以下内容是否有效?有更好的办法吗?

  1. 迭代 parent 和 parent 的 parent ,直到找到停止点,找到 sibling ,迭代 child 及其 child ,直到找到目标;

  2. 将关键对象保留在全局对象存储中(原文如此)并根据需要引用它们(是的)

  3. 使用特定的点符号来达到目标​​,包括元素(例如皮肤及其容器 - 再次是)

如有任何想法,我们将不胜感激。

编辑:

为了澄清这一点,我们采用一个空的 Flex 4 AIR 应用程序。显然,我们以 WindowedApplication 作为根,然后添加两个 SkinnableContainer 子级,ID 分别为 navContainermainContainer 。两者都有定制皮肤。在 mainContainer 中,我们有另一个具有垂直布局和 ID mainContentSkinnableContainer,并且作为其子级之一,它有一个对象(任何将do - 例如,一个带有 ID animatedBox 的 Spark BorderContainer,也许)。在 navContainer 中,我们有一个 Spark Button,它有一个绑定(bind)到 MouseEvent.CLICK 的监听器。在该函数中,我们需要访问 animatedBox (nativeWindow.mainContainer.mainContent.animatedBox) 并为其设置动画以更改(例如,它的宽度)。

目标是以尽可能不显眼且高效的方式访问远处的 DisplayObject (animatedBox),同时仍然符合我明确拥有的 Flex 标准尚未拥有。 :)

最佳答案

在我的实现中,这很容易做到(但是它是在纯 AS3 中):

在处理点击的显示对象中:

private function onClick(e:MouseEvent):void{
Radio.broadcast(new CustomEvent(id, ..params));
}

在动画框中:

Radio.addListener(id, new Reciever(uid, animate));

private function animate(e:CustomEvent) {
//needed code and access of CustomEvent props you pass
}

更新:

package lazylib.broadcast 
{
/**
* ...
* @author www0z0k
*/
public class Reciever
{
private var id: String;
private var toRun: Function;
/*@param nm - unique listener id - required
*@param fn - event handler function - required*/
public function Reciever(nm:String, fn:Function)
{
id = nm;
toRun = fn;
}

public function onEvent(e:* = null):String {
if (e == null) { return id; }
toRun(e);
return id;
}

public function get ID():String { return id; }

}

}

package lazylib.broadcast
{
import flash.events.Event;
import flash.events.EventDispatcher;
/**
* ...
* @author www0z0k
*/
public final class Radio extends EventDispatcher
{
private static var listeners: Object = new Object();
private static var archive: Array = new Array();
private static var forSlowpokes: Object = new Object();

public static function get ForSlowpokes():Object { return forSlowpokes; }

public static function addListener(type: String , listener: Reciever):Boolean {
listeners['anchor'] = null;
if (!listeners[type]) {
var o: Object = new Object();
listeners[type] = o;
}
if (!listeners[type][listener.ID]) {
listeners[type][listener.ID] = listener;
return true;
}else {
return false;
}
}

public static function broadcast(evt: * , singleUse:Boolean = false):void {
var type:String = (evt as Event).type;
if (listeners[type]) {
var returned: Array = new Array();
for (var i: String in listeners[type]) {
if(listeners[type][i]){
var fnRetVal: String = listeners[type][i].onEvent(evt);
returned.push(fnRetVal);
}else{
//trace("no listener for id = " + i + ' , type = ' + type);
}
}

}else {
//trace("nobody's interested in : \"" + type + "\"");
}
if (singleUse) {
forSlowpokes[type] = 'you missed it realtime';
delete listeners[type];
}
}

public static function clearDeadFuncs(namez:Object):void {
for (var a:String in namez) {
if (a != 'anchor') {
killListener(a, namez[a]);
}
}
}

public static function killListener(type: String , id: String):Boolean {
if (!listeners[type]) {
//trace("there are no listeners for event : " + "\"" + type + "\"");
return false;
}else {
if (!listeners[type][id]) {
//trace("there is no \"" + id + "\" listener for event : " + "\"" + type + "\"");
return false;
}else {
listeners[type][id] = null;
//trace("removed listener \"" + id + "\" for event : " + "\"" + type + "\"");
var evt2kill: Number = 0;
for (var str: String in listeners[type]) {
if (listeners[type][str]) {
evt2kill++;
}
}
if (evt2kill == 0) {
delete listeners[type];
//trace("no more listeners for event : " + "\"" + type + "\"");
return true;
}
return true;
}
}
}
}
}

按原样交付;)

关于apache-flex - AS3/Flex 4 : Most Practical Way To Find Nested Children,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4040300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com