- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有点一头扎进一些 Flex/AIR 的东西中。我对 AS3 有相当扎实的背景,但考虑到 Flex 固有的层次结构复杂性(与常规 Flash 相比),我遇到了一个问题。
假设您有一个应用程序,其中几乎所有内容都是事件驱动的(常见)。访问事件目标附近的元素或事件目标本身是微不足道的。然而,我试图找到最实用(读:最好、最有效)的方法来找到远离当前上下文的 child 。
我知道有像 getChildAt()
和 getChildByName()
这样的函数,但这假设有一个父上下文;如果您要查找的元素 (Flex) 是多个父级元素,在一个兄弟元素中,然后是多个子级元素,该怎么办?我们认为像 jQuery 这样的东西很容易做到这一点,但显然我们在 AS3 中没有那么奢侈。
以下内容是否有效?有更好的办法吗?
迭代 parent 和 parent 的 parent ,直到找到停止点,找到 sibling ,迭代 child 及其 child ,直到找到目标;
将关键对象保留在全局对象存储中(原文如此)并根据需要引用它们(是的)
使用特定的点符号来达到目标,包括元素(例如皮肤及其容器 - 再次是)
如有任何想法,我们将不胜感激。
编辑:
为了澄清这一点,我们采用一个空的 Flex 4 AIR 应用程序。显然,我们以 WindowedApplication
作为根,然后添加两个 SkinnableContainer
子级,ID 分别为 navContainer
和 mainContainer
。两者都有定制皮肤。在 mainContainer
中,我们有另一个具有垂直布局和 ID mainContent
的 SkinnableContainer
,并且作为其子级之一,它有一个对象(任何将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/
我是一名优秀的程序员,十分优秀!