zoukankan      html  css  js  c++  java
  • flex Error #1034: 强制转换类型失败

    TypeError: Error #1034: 强制转换类型失败:无法将 Object@1aee90b1 转换为 mx.messaging.messages.IMessage。


    需求背景 :
    通过树形菜单加载多个不同的module。
    问题现象 :module页面存在拖动,Popup,Alert或者colorpicker出现错误信息:
    TypeError: Error #1034: 强制转换类型失败:无法将 mx.managers::PopUpManagerImpl@7155ac1 转换为 mx.managers.IPopUpManager。
    解决方案 
    在Application加入如下代码引用:


         < mx:Script > 
            
     <! [CDATA[
                
     import  mx.managers.DragManager;
                
     import  mx.managers.IPopUpManager;            
                
                
     /*  Create dummy variables.  */ 
                
     // 避免出现:无法将 mx.managers::PopUpManagerImpl@52a09a1 转换为 mx.managers.IPopUpManager 错误 
                 private  var dragManager : DragManager;
                
     private  var popUpManager : IPopUpManager;
               
                //process....

            ]]>
        </mx:Script>
    问题原因分析 
    属于ModuleLoader shared code problem .
    当Module中使用managers时(如PopUpManager,DragManager, HistoryManager等)则可能出现这个问题(当application里在loader之前没有引入这些manager的引用时)。
    manager的方法是静态方法,整个应用程序中创建了一个该manager接口的singleton实例,但module仅在自己的 Application domain中使用该单例, 当多个module使用同一个单例manager且main application没有使用时,就会出现这个空对象引用问题:第一个引入某manager的module不能将该manager接口的 singleton跟其他module共享,其他module调用该Manager的方法时,应用程序不会再创建该manager接口的实例,这个 module就无法引用到该manager接口的实例,就出现了空对象引用问题.
    参考资料:Flex sdk源码。

    目前在Application创建了些Application范围内没有使用到的"木偶变量",从代码可读性上来说不是很好。有其他比较好的解决方案的同学麻烦请告之下,:) 


    <noscript type="text/javascript"> //<![CDATA[ Sys.WebForms.PageRequestManager._initialize('AjaxHolder$scriptmanager1', document.getElementById('Form1')); Sys.WebForms.PageRequestManager.getInstance()._updateControls(['tAjaxHolder$UpdatePanel1'], [], [], 90); //]]> </noscript> 

    Feedback

    同事推荐了个更好的办法:
    在ModuleLoader 的creationComplete方法中加入如下代码:
    moduleLoader.applicationDomain = ApplicationDomain.currentDomain;
    就可以在Application里切换多个module而不需要在Application里明文引用单例manager声明。比我上面所说的方法更好的能解决问题而且,代码可读性更好。
    另外,推荐在moduleloader做切换的时候,加上:
    moduleLoader.unloadModule再做moduleLoader.loadModule().

    在这里做个小记。

  • 相关阅读:
    POJ 2018 二分
    873. Length of Longest Fibonacci Subsequence
    847. Shortest Path Visiting All Nodes
    838. Push Dominoes
    813. Largest Sum of Averages
    801. Minimum Swaps To Make Sequences Increasing
    790. Domino and Tromino Tiling
    764. Largest Plus Sign
    Weekly Contest 128
    746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/myssh/p/1867902.html
Copyright © 2011-2022 走看看