BlazeDS Flex-AJAX Bridge加载不适用于Ext.JS

时间:2010-01-29 18:01:38

标签: ajax flex extjs blazeds

Flex-AJAX桥的FDMSLib有一个加载函数,可以将flash对象呈现给调用它的页面。这会导致使用Ext.JS时出现问题,因为插入的对象可能会被另一个渲染函数丢弃,或者在渲染页面时导致冲突,所以我试图重写加载函数以便它的Ext.JS(可能还有其他) JS框架)友好。

这是原始功能。

FDMSLibrary.load = function(path, callback)
{
    var result = "<object id='_fesLib' classid='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000' \
                 codebase='http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,5,0,0' \
                  height='1' width='1'> \
                 <param name='flashvars' value='bridgeName=flash'/> \
                 <param name='AllowScriptAccess' value='always'/> \
                 <param name='src' value='"+ (path != undefined ? path : "") + "'/> \
                 <param name='wmode' value='transparent' /> \
                 <embed name='_fesLib' pluginspage='http://www.macromedia.com/go/getflashplayer' allowScriptAccess='always'\
                 src='" + (path != undefined ? path : "") + "' height='1' width='1' flashvars='bridgeName=flash'/> \
              </object>";
    document.write(result);

   // todo:need a callback and variable here so you can keep track that both the fabridge and the fdmsbridge are available
    FDMSLibrary.addInitializationCallback("flash", callback);

  // register for call back when the FABridge has completed initialization
    FABridge.addInitializationCallback("flash", FABridge_ready);
 }

我已将此替换为以下内容:

loadFDMSBridge: function(path,callback) {
    var FABridgeSWF = new Ext.FlashComponent({
        id : '_fesLib',
        height: '1',
        width: '1',
        flashVars : {
            bridgeName:'flash'
        },
        wmode : 'transparent',
        flashVersion : '8.5.0.0',
        renderTo : Ext.getBody(),
        url : path,
        listeners : {
            'render' : {
                fn : this.initBridge,
                scope : this
            }

        }
    });


},
initBridge : function () {
        FDMSLibrary.addInitializationCallback("flash", this.initPolling);
        FABridge.addInitializationCallback("flash", FABridge_ready);
}

flash对象呈现给页面,它使用object中的data属性而不是src param,但我认为这对于渲染flash对象是正确的。

我遇到的问题是,当我调用FDMSLibrary.addInitializationCallback函数时,看起来桥已经就绪。

swf文件告诉javascript它已准备好使用。我很确定swf没问题,因为我有一个简单的测试页面并使用相同的swf和javascript库运行,但没有任何其他javascript,内容等的任何干扰。有点像瑞士法郎没有被加载和“执行”,Firebug似乎支持这一点,但我真的不知道为什么或我错过了什么。

如果您想查看FABridge的完整javascript库和actionscript源,可以在Adobe的subversion repo中找到它们:fds ajax bridge repo path

提前感谢您的帮助

3 个答案:

答案 0 :(得分:1)

不确定,但您可以尝试afterrender事件而不是render。正如稍后在渲染周期中发生的那样(好吧,在它之后:)它可能会有所帮助 - 我知道在某些组件的某些部分实际上完成渲染之前,过去一直存在渲染问题(这就是后来添加了后来事件的原因)。

如果不起作用,另一件事可能是尝试稍微推迟initBridge功能。这有点延伸,但我已经看到过以前的情况,其中存在JS执行的时间问题,或者可能是导致此类症状的一些阻塞。推迟你的代码将延迟执行并在新线程上执行它,这可以解决问题。不是最好的解决方案,但我通过这种方式解决了几个浏览器问题。 E.g:

initBridge : function () {
    (function(){
        FDMSLibrary.addInitializationCallback("flash", this.initPolling);
        FABridge.addInitializationCallback("flash", FABridge_ready);
    }).defer(500, this);
}

至少这可能会确认它是否是时间/阻塞问题。您可以向上或向下调整500(ms)以查看是否有任何不同的行为。

答案 1 :(得分:0)

@bmoeskau:感谢有用的建议。

再次根据您的建议查看我的代码,我意识到了一些事情。

首先是我在错误的文件中进行更改。我做了一个独立的版本,不小心编辑了那些文件而不是ext.js应用程序。

其次,随着所有的变化,测试和一般的混乱,我设法使我的一些函数重载,这意味着调用了错误的函数。无论我改变了多少我正在看的功能它从未被调用过。

上述代码实际上如上所述。

答案 2 :(得分:0)

只是整理一下:

我继续提出Firefox bug and swfobjects(Ext.Flashcomponent的底层库)的问题。我最终不得不将原始html从FDMSLib load()函数推送到DOM而不是使用Ext对象。

    // spec up the flash object for FABridge
    var foSpec = {
            tag : 'object',
            id : '_fesLib',
            classid : 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000',
            codebase: 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,5,0,0',
            height :'1',
            width : '1',
            cn : [
                    {tag:'param', name:'flashvars', value:'bridgeName=flash'},
                    {tag:'param', name:'AllowScriptAccess', value:'always'},
                    {tag:'param', name:'src', value:path},
                    {tag:'param', name:'wmode', value:'transparent'},
                    {tag:'embed', name:"_fesLib", pluginspage:'http://www.macromedia.com/go/getflashplayer', allowScriptAccess:'always', src:path, height:'1', width:'1', flashvars:'bridgeName=flash'}                   
            ]

    };
    // Add it to the end of the body
    Ext.getBody().createChild(foSpec);

我模糊地回忆起某个帖子,说FABridge使用“embed”标签,因为swfobject没有插入“嵌入”标签,这也可能导致问题。

除此之外,Ext.Flashcomponent的flashParams属性在所需的参数上引用this adobe technote。这表明只包含flash对象的对象必须包含param“movie”。 swfobject强行删除任何名为“movie”的参数。

在任何地方都没有多少乐趣!