2013-02-15 78 views
1

好吧,我想我最好先問問別人,然後再開始撕掉我的頭髮。我一直在從一個XML文件加載數據,並且這個想法是,如果loadDetails在加載xml後被調用,它會在這個基礎上加載它們,如果它被調用之後它會設置一個標誌來告訴對象當xml完成​​時自動再次調用它。很簡單,對吧?AS3:在一個函數中設置的變量在另一個函數中具有不同的值

private function parseXML(e:Event):void 
{ 
    trace("parseXML " + mLevelID.toString(16) + " " + mAutoload); 
    var xml:XML = new XML(e.target.data); 
    // do stuff... 
    System.disposeXML(xml); 
    mDetailsReady = true; 
    if (mAutoload) 
     loadDetails(); 
} 

private function cancelXML(e:Event):void 
{ 
    trace("cancelXML " + mLevelID.toString(16)); 
    mAutoload = false; 
} 

public function loadDetails():void 
{ 
    if (!mDetailsReady) 
    { 
     if (!mAutoload) 
      trace("autoload on " + mLevelID.toString(16)); 
     mAutoload = true; 
     return; 
    } 
    if (mAutoload) trace("autoloaded " + mLevelID.toString(16)); 
    // do stuff... 
    mAutoload = false; 
} 

問題出在這裏。它不會調用loadDetails,即使標誌設置正確,或者不是總是。以下是一些示例輸出:

autoload on 0 
autoload on a 
autoload on 1 
cancelXML 1 
parseXML 0 true 
autoloaded 0 
parseXML a false 

正如您所看到的,它會在所有三個級別中跟蹤設置mAutoload。但是,當實際解析aml中的xml時,它會將mAutoload查詢爲false,並且無法自動加載 - 並且,不,它不會在另一個函數中被設置爲false,而是其他函數將mAutoload設置爲false是構造函數。

我真的很困惑和沮喪。我想我願意接受這只是AS3的荒謬,願意就如何繞過這個問題提出建議,但現在我只是非常沮喪。任何反饋意見。

+0

我認爲這將有助於看到更多的代碼。特別是,什麼使「自動加載0」線?我注意到,在loadDetails中,如果細節已準備就做的第一件事是將mAutoload設置爲false。我猜「自動加載」行顯示你正確地通過了loadDetails。如果將它設置爲false,那麼會使'parseXML爲false'行適當的響應。 – 2013-02-15 15:14:53

+0

這裏沒有看到整個圖片。 mAutoload和mDetailsReady變量在哪裏被聲明?這是你正在實例化的類還是文檔代碼?你是在課堂外部還是內部查詢這些變量? – Atriace 2013-02-15 15:16:55

+0

哎呀抱歉,我刪除了'自動加載'行,當我切出'做東西'行。我重新編輯它,但它只是緊跟在條件塊之後的一條跟蹤語句。這可以解釋它,但a)情況並非如此,b)它無法解釋爲什麼它適用於0級。 mAutoload和mDetailsReady都是私有成員變量,並且完全按照您在此處看到的方式使用:唯一的其他用法是初始化爲false。 – 2013-02-15 18:36:19

回答

0

你的邏輯是關閉

的方法parseXML你做

mDetailsReady = true; 
if (mAutoload) 
    loadDetails(); 

這意味着mAutoload是真實的,mDetailsReady是真的

但loadDetails方法

if (!mDetailsReady) 
{ 
    if (!mAutoload) 

我,不確定你想用這個班級取得什麼成績,但是如果你正在寫作某種類型的xml加載器類,您可能想要使用更多的Loader類增強器來確定它是否已完成加載,而不是您自己跟蹤它。

+0

對不起,我認爲你可能會對條件感到困惑:「if(!mAutoload)」只是跟蹤的條件,因爲否則它會多次跟蹤同一事物,因爲加載函數被重複調用。 流程如下:在實例化時,對象加載它的xml。如果在完成之前調用loadDetails,它會設置mAutoload,它告訴對象在解析xml時再次調用loadDetails。 如果你看看什麼追蹤出來,這適用於0級,並正確取消1級(無xml),但在級別上奇怪地工作 – 2013-02-15 18:25:56

+0

「loadDetails」只能從「parseXML」內的一個地方調用。 「parseXML」一旦從一個地方被調用,並且是xml的完全加載。你似乎不願意展示整個班級,所以除了我已經說過的內容之外,我無法真正幫上大忙。如果你正在從另一個區域調用「parseXML」或「loadDetails」,那麼你有一個主要的設計缺陷。 – 2013-02-15 18:39:16

+0

對不起,loadDetails被稱爲外部。爲什麼這是一個主要的設計缺陷?我不介意展示這個課程,但大部分內容並不相關,總共有500多行 – 2013-02-15 18:43:27

相關問題