2011-01-23 61 views
0

我似乎在對象中有一些無關字符,我是Actionscript的新手,所以我不知道它們是否屬於該屬性,我似乎無法提取感興趣的參數。下面的代碼段:Actionscript 2從查詢返回loadvars的問題

_root.buttonBkg.onPress = function() { 
    var wikiload1:LoadVars = new LoadVars(); 
    var wikiload2:LoadVars = new LoadVars(); 
    wikiload1.wikiname = wikiterm; 
    wikiload2.onLoad = function(success:Boolean) { 
    trace("entered wikiload1.onLoad function") 
    if (success) { 
    _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380); 
    _root.wikidisplay.html = true; 
    _root.wikidisplay.htmlText = wikiload2.displayhtml; 
    trace("wikiload2.displayhtml is" + wikiload2.displayhtml); 
    trace(wikiload2.toString()); 
    trace("success route"); 
    } 
    else { 
    _root.createTextField("wikidisplay", _root.getNextHighestDepth(), 0, 150, 550, 380); 
    _root.wikidisplay.text = "Error connecting to server."; 
    trace("error route"); 
    } 
    }; 
    wikiload1.sendAndLoad("http://myURL.script.py", wikiload2, "POST"); 
    trace("?wikiname=" + wikiload1.wikiname); 
    trace("did the sendAndLoad") 
    } 

這裏的跟蹤結果:

〜/ src目錄/ Main.as:70:wikiname =咖啡

〜/ src目錄/ Main.as:71:沒有所述sendAndLoad

〜/ SRC/Main.as:53:輸入wikiload1.onLoad功能

〜/ SRC/Main.as:58:wikiload2.displayhtml isundefined

〜/ src/Main.as:59:%0Adisplayhtml =%3Cp%3E%3Cb%3ECoffee%3C%2Fb%3E%3C%2Fp%3E%3Cp%3E%3Cbr%2F%3E%3Cbr%2F% 3ECoffee%圖20是%20A%20brewed%20drink%20prepared%20 [DELETED MUCH返回的值,這是LONG] DIV%3E%0A &的onLoad =%5Btype%20Function%5D

〜/ SRC/Main.as:60:成功路線

爲什麼wikiload2.displayhtml未定義?這是一個Actionscript錯誤,或者我調用它的腳本(Web服務器上的python腳本)有問題。

回答

1

無論你是否對python服務器有問題,都應該使用代理嗅探器來檢查,如Charles,Fiddler或者甚至FireBug。結果看起來很好,但我不確定在跟蹤(wikiload2.toString)中看到的換行符%0A是否會導致loadVars解析出現問題。嘗試先刪除。

我不確定這是否是修復程序,但是您說您是AS2的新手,請讓我進一步瞭解您的代碼以備將來參考。我假設你必須在AS2中有一個原因,並且不能使用AS3。但是,即使使用AS2,我也會敦促您研究面向對象的編程。一旦你這樣做了,結構化代碼變得更加容易,與第三方框架一起工作,並保持項目的可維護性。

在框架中,例如,有一個名爲ASAPFramework。它有一個名爲LoadVarsXML的非常簡單的對象,它可以讓您將加載的結果作爲XML對象加載。在python和flash中更好的調試比loadVars結構。

另有建議;在AS2中,方法調用的範圍可以是方法聲明範圍之外的另一個範圍。換句話說,當您在onLoad等事件回調中傳遞該方法時,可能無法訪問與該方法在同一對象中定義的變量。解決這個問題的一種方法是通過全局存儲每個值,就像使用_root前綴一樣。然而,這使得你的代碼很難閱讀,難以理解,而且你已經注意到,很難調試。 *使用_root通常是一個很大的禁忌*。如果您繼續擴展您的示例腳本,您最終會發現自己在代碼意大利麪條中沒有任何人要求您提供幫助,他們將能夠理解。

解決此問題的方法是開始使用類而不是框架腳本,但即使您想堅持這些,您也可以通過使用Delegate.create(scope,method)包裝回調方法來清理一些事情)。

下面是代碼使用Delegate.create方法的樣子。我還冒昧地將你的wikiLoad1和2變量重寫到wikiLoader和wikiResults。這使得它們的任務更加清晰。

_root.buttonBkg.onPress = Delegate.create(this, handleButtonPress); 

function handleButtonPress():Void { 
    var wikiResult:LoadVars = new LoadVars(); 
    wikiResult.onLoad = Delegate.create(this, handleWikiLoad); 

    var wikiLoader:LoadVars = new LoadVars(); 
    wikiLoader.wikiname = wikiterm; 
    wikiLoader.sendAndLoad("http://myURL.script.py",wikiResult,"POST"); 
    trace("?wikiname=" + wikiLoader.wikiname); 
    trace("did the sendAndLoad"); 
} 

function handleWikiLoad(success:Boolean):Void { 
    trace("entered wikiLoader.onLoad function"); 
    if (success) { 
     _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380); 
     _root.wikidisplay.html = true; 
     _root.wikidisplay.htmlText = wikiResult.displayhtml; 
     trace("wikiResult.displayhtml is" + wikiResult.displayhtml); 
     trace(wikiResult.toString()); 
     trace("success route"); 
    } else { 
     _root.createTextField("wikidisplay",_root.getNextHighestDepth(),0,150,550,380); 
     _root.wikidisplay.text = "Error connecting to server."; 
     trace("error route"); 
    } 
} 

我認爲這看起來更清潔,因此更容易理解。如上所述,嘗試刪除python中的換行符,如果可以,請從ASAP檢查LoadVarsXML。它將嚴重簡化AS2的生活。

+0

非常感謝!您的代碼清理是讚賞。順便說一句,是的,因爲它是壞的,我的代碼將工作,如果我有一個更少的換行符正在調用它的腳本(現在已經修復)。如果我進一步瞭解這一點,我會檢查一下ASAPFramework。這個項目是Chumby的一個應用程序(這就是爲什麼它需要使用ActionScript 2而不是3)。 – ViennaMike 2011-01-23 16:18:38