Загрузка BlazeDS Flex-AJAX Bridge не работает с Ext.JS - PullRequest
0 голосов
/ 29 января 2010

FDMSLib для моста Flex-AJAX имеет функцию загрузки, которая отображает флэш-объект на странице, где бы он ни вызывался. Это вызывает проблемы при использовании 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-объект отображается на странице, он использует атрибут data в объекте, а не src param, но я предполагаю, что это правильно для рендеринга flash-объектов.

Проблема, с которой я сталкиваюсь, заключается в том, что при вызове функции FDMSLibrary.addInitializationCallback может показаться, что мост не готов.

Файл swf сообщает javascript, что он готов к использованию. Я почти уверен, что с swf проблем нет, так как у меня есть простая тестовая страница, запускаемая с использованием тех же библиотек swf и javascript, но без какого-либо вмешательства со стороны любого другого javascript, содержимого и так далее. Такое ощущение, что swf не загружается и «не выполняется», и Firebug, похоже, подтверждает это, но я не знаю, почему или что я пропустил.

Если вы хотите увидеть полные библиотеки javascript и источник ActionScript для FABridge, вы можете найти их здесь в репозитории Adobe Subversion: fds ajax bridge repo path

Заранее спасибо за помощь

Ответы [ 3 ]

1 голос
/ 30 января 2010

Не уверен, но вы можете попробовать событие afterrender вместо render. Как это происходит позже в цикле рендеринга (ну, после него :), это могло бы помочь - я знаю, что в прошлом были проблемы с запуском рендера до того, как некоторые части компонента фактически сделали рендеринг ( именно поэтому событие afterrender было добавлено позже).

Еще одна вещь, если это не сработает, это попытаться немного отложить вашу функцию initBridge. Это немного натянуто, но я уже видел случай, когда есть проблема синхронизации с выполнением JS или, возможно, некоторая блокировка, которая вызывает этот тип симптома. Откладывание вашего кода приведет к задержке его выполнения и выполнению в новом потоке, что может решить проблему. Не лучшее решение, но я обошел несколько странностей браузера таким образом. E.g.:

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

По крайней мере, это может подтвердить, является ли это проблемой синхронизации / блокировки. Вы можете отрегулировать 500 (мс) вверх или вниз, чтобы увидеть, нет ли различий в поведении.

0 голосов
/ 03 февраля 2010

Просто чтобы привести это в порядок:

У меня были постоянные проблемы из-за ошибки Firefox и swfobjects (базовой библиотеки Ext.Flashcomponent).В итоге мне пришлось вставить исходный HTML-код из функции load () FDMSLib в 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"tag и поскольку swfobject не вставляет тег «embed», это также может вызывать проблемы.

Чтобы добавить к этому, свойство flashParams в Ext.Flashcomponent ссылается на этот Adobe Technote по обязательным параметрам.Это говорит о том, что объект, включающий только флэш-объект, должен включать параметр «фильм».swfobject принудительно удаляет любой параметр с именем «movie».

Не так уж и весело с этим!

0 голосов
/ 01 февраля 2010

@ bmoeskau: спасибо за полезные советы.

Глядя на мой код снова с вашими предложениями, я понял пару вещей.

Сначала я делал изменения в неправильных файлах. Я сделал отдельную версию и случайно редактировал эти файлы, а не приложение ext.js.

Во-вторых, со всеми изменениями, тестированием и общими проблемами я сумел перегрузить некоторые из своих функций, что означало, что вызывались неправильные функции. Независимо от того, насколько я изменил функцию, на которую я смотрел, она так и не была вызвана.

Приведенный выше код фактически работает как заявлено.

...