Функция обратного вызова на стороне сервера для решения зависимости порядка выполнения JS-CF? - PullRequest
0 голосов
/ 10 августа 2010

Я хотел бы вызвать форму как всплывающее окно (форма с некоторыми полями ввода и кнопкой отправки), а затем прочитать выбранные пользователем результаты сеанса.Проблема заключается в том, что смешивание кода JS (всплывающее окно) с кодом CF (на стороне сервера), как и ожидалось, заставляет процесс вывести переменную сеанса до того, как процесс обновит ее.Для лучшего понимания ниже приводится сценарий вместе с некоторыми соответствующими фрагментами кода:

Сценарий:

       1. User calls ShowForm(..)
       2. ShowForm(..) displays a pop-up window and waits for the user
to submit his selection
       3. The result gets stored in the session
       4. The function returns the user-submitted result

form.cfc

    <cffunction name="ShowForm" access="public" output="true" returntype="string">

        <script>
         window.showModalDialog('formpage.cfm',null,"dialogHeight=400px,dialogLeft=150px"); 
    </script>

        <cfreturn session.form_result> <!--- @toFix: The return of form_result is happening before the actual form_result is set. ---> 
   </cffunction>

formpage.cfm

    <cfajaxproxy cfc="components.sess_mgr" jsclassname="JSMaskProxy">


    <script>
    function submitSelection(formObj)
    {

     for (i=0; i<intSelValue.length; i++)
      result.push(intSelValue[i]);

       var instCfProxy = new JSMaskProxy();                 
      instCfProxy.setToSession(result);     // updates session.form_result
      //window.returnValue=result;  
      window.close();
    }
    </script>

     <form name="frmDtls">
        <td align="center"><input type="button" id="selectButton" name="selectButton" onClick="submitSelection(details);">
     </form>

Что вы думаете об этом?Как решить эту проблему?

Функция ColdFusion.navigate (..) может иметь функцию обратного вызова и обработчик ошибок, но дело в том, что функция обратного вызова может быть только функцией на стороне клиента.Если бы эта функция могла быть функцией CF или страницей на стороне сервера, я думаю, что это решило бы эту проблему зависимости.

Что-то побочное, в идеале я хотел бы прочитать значение из window.showModalDialog, а не читатьэто из сессии, но это всего лишь набросок, и главное здесь - как преодолеть эту смешанную проблему JS-CF.

Ответы [ 2 ]

1 голос
/ 11 августа 2010

Вместо того чтобы использовать window.showModalDialog, используйте что-то вроде cfwindow, jQuery dialog или extjs window.Все они имеют некоторую форму обратного вызова или прослушивателя событий.В cfwindow есть функция onHide, в диалоговом окне jQuery есть опция закрытия, которой можно назначить функцию, в ext.window есть onHide, а также прослушиватели событий.

Все это позволит вам открыть новое "окно"и запустить некоторую функцию, когда окно скрыто или закрыто.Все эти функции должны иметь доступ к чему-либо из окна, а также иметь возможность доступа к главному окну.

У Рэя Камдена есть пример cfwindow: http://www.coldfusionjedi.com/index.cfm/2008/9/26/Ask-a-Jedi-Another-CFWINDOW-Example

В диалоговом окне jQuery есть примерчто вам нужно: http://jqueryui.com/demos/dialog/#modal-form

Примеры Sencha Ext.Window показывают передачу значений в главное окно при закрытии диалога: http://dev.sencha.com/deploy/dev/examples/message-box/msg-box.html

Множество вариантов там.Я надеюсь, что они помогают.

0 голосов
/ 11 августа 2010

Проблема решена!

Принятое решение основано на идее Стивена Моретти, которая заключается в замене window.showModalDialog вызовом cfwindow. Одно это не решает проблему. Тем не менее, я работал при замене тега script на cfscript, а затем внутри cfscript просто делаю перенаправление на серверную страницу на тег cfwindow.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...