我在子MC中定义了一些变量:
var first_nme = data.return_first;
var second_nme = data.return_second;
var email_addr = data.return_email;
var user_domain = data.return_domain;
var user_name = data.return_username;
我正在尝试在父动画片段/另一个动画片段中使用这些变量。
我尝试了跟踪方法:
trace(MovieClip(verif).first_nme);
//'verif' is the mc name
trace(MovieClip(parent).first_nme);
以上两者都为var first_nme返回了一个未定义的错误。
谁能告诉我如何正确地做到这一点?
感谢
修改
儿童:
function completeHandler(event:Event):void{
// Load the response from the PHP file
var data:URLVariables = new URLVariables(event.target.data);
var returnn_stat = data.return_status;
var ffferror256 = data.return_value;
returnn_stat = returnn_stat.replace(/\s/m, "");
if (returnn_stat == "FAILED"){
status_txt.text = ffferror256;
}
else if (returnn_stat == "PASSED"){
var first_nme = data.return_first;
var second_nme = data.return_second;
var email_addr = data.return_email;
var user_domain = data.return_domain;
var user_name = data.return_username;
MovieClip(parent).gotoAndPlay("confirm");
first_txt.text = first_nme;
second_txt.text = second_nme;
email_txt.text = email_addr;
username_txt.text = user_name;
domain_txt.text = user_domain;
}
else {
status_txt.text = "Oops, something went wrong. Please try again later.";
}
}
PARENT:
trace(MovieClip(verif).getChildAt(0).first_nme);
txtt_txt.text = first_nme;
我尝试使用行trace(MovieClip(verif).getChildAt(0).first_nme);
中的帧编号,但仍然是相同的错误。
答案 0 :(得分:2)
将范围first_name尝试为public:
public var first_nme = data.return_first;
答案 1 :(得分:2)
看来你错过了孩子的参考文献
假设您将子项的名称设置为“childname”
childmc.name = "childname"; // to set the name of the child
...
trace(MovieClip(verif).getChildByName("childname").first_nme);
OR
trace(MovieClip(verif).getChildAt(0).first_nme);
trace(MovieClip(verif).getChildAt(1).first_nme);
etc...
答案 2 :(得分:2)
您似乎提前调用了trace
,因为您在子mc中异步加载了某些内容。在这里做的正确的事情是加载子mc中的东西,当加载过程完成(onCompleteHandler
)时,你触发一个由父mc处理的事件。您还可以将加载的数据添加到(custom-)事件,并使用eventobject将其传递给父级:
function completeHandler(event:Event):void
{
// Load the response from the PHP file
var data:URLVariables = new URLVariables(event.target.data);
var returnn_stat = data.return_status;
var ffferror256 = data.return_value;
returnn_stat = returnn_stat.replace(/\s/m, "");
if (returnn_stat == "FAILED")
{
status_txt.text = ffferror256;
}
else if (returnn_stat == "PASSED")
{
var evt:MyCustomEvent = new MyCustomEvent(MyCustomEvent.DATA_LOADED, true, true);
evt.first_name = first_nme;
evt.second_name = second_nme;
evt.email = email_addr;
evt.username = user_name;
evt.domain = user_domain;
dispatchEvent(evt);
}
else
{
status_txt.text = "Oops, something went wrong. Please try again later.";
}
}
然后你的父mc中有一个eventlistener:
this.addEventListener(MyCustomEvent.DATA_LOADED, onDataComplete);
// ...
private function onDataComplete(evt:MyCustomEvent):void
{
gotoAndPlay("confirm");
first_txt.text = evt.first_name;
second_txt.text = evt.second_name;
email_txt.text = evt.email;
username_txt.text = evt.username;
domain_txt.text = evt.domain;
}
以及最后但并非最不重要的自定义事件类:
package
{
import flash.events.Event;
public class MyCustomEvent extends Event
{
public static const DATA_LOADED:String = "onDataLoaded";
public var first_name:String;
public var second_name:String;
public var email:String;
public var username:String;
public var domain:String;
public function MyCustomEvent($type:String, $bubbles:Boolean = false, $cancelable:Boolean = false)
{
super($type, $bubbles, $cancelable);
}
}
}
答案 3 :(得分:2)
请参阅此link
在子mc中将变量定义为public
,否则它们将限定为default
可见性,即对另一个组件不可见,除非访问和访问的组件都属于同一名称空间
答案 4 :(得分:2)
很少有事情可以想到。
只是为了确定:我看到你使用MovieClip(父).gotoAndPlay;在父母时间轴的那一部分,儿童movieclip仍然存在于舞台上?否则它将被删除,并且getChildAt()将不会返回它。
您确定getChildAt(0)返回正确的MovieClip吗?由于形状,图形等也是子项(您可以检查父项的numChildren属性)。
getChildAt()以DisplayObject类型返回结果;这不是一个动态的类。尝试引用任何未知的变量或属性将导致错误。但是,如果将结果类型转换为MovieClip;您可以访问新的变量和属性(因为MovieClip是一个动态类)。请尝试以下方法:
trace(MovieClip(MovieClip(verif).getChildAt(0)).first_nme);
BTW:如果你给了一个实例名称,你也可以用名字来引用它,而不是使用getChildAt()(verif.somename.first_nme)。
答案 5 :(得分:2)
父剪辑无法访问这些变量,除非您将它们声明为公共变量。如果您没有声明属性属性,它将默认为internal,这意味着它只对同一个包中的类可见。当您尝试访问它们时,您不会收到任何警告,因为MovieClip是动态的,但是当您尝试访问它们时,您将收到错误。
如果您发布了全班,会很有帮助。
答案 6 :(得分:1)
您是否为您的孩子mc设置了实例名称?
如果是,请尝试遵循此。
trace(MovieClip(root).child_mc.variable_name);
另一个重要的事情你应该记住,每当你创建子MovieClip时,它将在其父级之后执行,所以如果你直接从父级跟踪变量(子)。它会显示NAN,因为它没有被执行。
这样,从父母那里追踪孩子Mc的变量只需要调用你孩子的一个函数(追踪孩子mc变量的父母)。
您孩子的代码mc
var test:Number = 123;
MovieClip(root).test_var();
根框架中的代码
function test_var()
{
trace(MovieClip(root).mc_test.test);
}
您需要在功能之前创建变量。
var first_nme:String;
var second_nme:String;
var email_addr:String;
var user_domain:String;
var user_name:String;
function completeHandler(event:Event):void{
// Load the response from the PHP file
var data:URLVariables = new URLVariables(event.target.data);
var returnn_stat = data.return_status;
var ffferror256 = data.return_value;
returnn_stat = returnn_stat.replace(/\s/m, "");
if (returnn_stat == "FAILED"){
status_txt.text = ffferror256;
}
else if (returnn_stat == "PASSED"){
first_nme = data.return_first;
second_nme = data.return_second;
email_addr = data.return_email;
user_domain = data.return_domain;
user_name = data.return_username;
MovieClip(parent).gotoAndPlay("confirm");
first_txt.text = first_nme;
second_txt.text = second_nme;
email_txt.text = email_addr;
username_txt.text = user_name;
domain_txt.text = user_domain;
}
else {
status_txt.text = "Oops, something went wrong. Please try again later.";
}
希望它能帮助........
答案 7 :(得分:0)
您的变量未在正确的范围级别声明。你在一个函数中声明它们,这使得它们对movieclip的父类是不可见的。如果您希望能够从父类访问变量,则必须直接在子类中声明它们,以便在实例化子项时包含它们。
例如:
package
{
import flash.display.MovieClip;
public class WHATEVER extends MovieClip
{
// declare your variables here
public var SOMEVAR:String;
public function WHATEVER():void { }
private function onComplete(e:Event):void
{
SOMEVAR = "Something";
// this variable will not be visible to parent
var NEWVAR:String = "I'm invisible";
}
}
}
由于该值是在定义时异步填充的,因此您需要在父级中使用它之前测试该值。或者,您可以在设置值时触发事件,并让父级侦听该事件以更新其所需的内容。
答案 8 :(得分:0)
我猜测儿童movieclip正坐在时间轴上,并且当播放头到达父时间轴中的那个帧时,您正试图访问其中的变量。如果情况确实如此,那么问题就出现了,因为你在渲染之前试图访问对象的内容。
尝试将变量访问代码放在函数中,并使用Event.Render事件侦听器调用它。然后,您需要做的就是从时间轴调用stage.invalidate(),并且该变量应该是可访问的。
例如:
在父时间轴上:
this.addEventListener(Event.RENDER, stageRender);
function stageRender(e:Event):void
{
//your variables access code goes here
}
stage.invalidate();