Назначение клиентских переменных ColdFusion с использованием Javascript - PullRequest
3 голосов
/ 11 февраля 2009

Можно ли назначить переменные для клиентской области с помощью JavaScript? Более конкретно, я пытаюсь присвоить значение после того, как оно возвращается из вызова AJAX.

Я понимаю, что ColdFusion запускается на стороне сервера, а JavaScript - на стороне клиента, но с распространением AJAX мне любопытно, возможно ли что-то подобное. Спасибо.

Ответы [ 5 ]

4 голосов
/ 13 февраля 2009

Питер Боутон был почти мертв в своей концепции, но вы спросили, как писать переменные клиента, и он не тестировал свой код. Кроме того, то, что вы пытаетесь сделать, будет называться ClientFacade, поэтому я написал (и протестировал) CFC ClientFacade и сопутствующий JavaScript. Обратите внимание, что я использую jQuery, потому что я никуда не хожу без него. ;)

ClientFacade.cfc:

<cfcomponent output="false"
  hint="acts as a remote facade for the client scope">

    <cffunction name="set" output="false" access="remote"
      returntype="boolean" hint="sets a value into the client scope">
        <cfargument name="name" type="string" required="true"/>
        <cfargument name="val" type="any" required="true"/>

        <!--- you should sanitize input here to prevent code injection --->

        <cfscript>
            try {
                client[arguments.name] = arguments.val;
                return(true);
            }catch (any e){
                return(false);
            }
        </cfscript>
    </cffunction>

    <cffunction name="get" output="false" access="remote" returntype="any"
      hint="gets a value from the client scope">
        <cfargument name="name" type="string" required="true"/>
        <cfargument name="defaultVal" type="any" required="false"
            default=""/>

        <!--- you should sanitize input here to prevent code injection --->

        <cfscript>
            if (structKeyExists(client, arguments.name)){
                return(client[arguments.name]);
            }else{
                if (len(trim(arguments.defaultVal)) eq 0){
                    return('');
                }else{
                    return(arguments.defaultVal);
                }
            }
        </cfscript>

    </cffunction>

</cfcomponent>

test.cfm:

<script type="text/javascript"
  src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js">
  </script>
foo:<input type="text" name="foo" id="foo"/>
<button id="setValue">Set Value</button>
<button id="alertValue">Alert Value</button>

<script type="text/javascript">
    $(document).ready(function(){

        //attach functionality to our alert button
        $("#alertValue").click(function(e){
            var clientVal = 'initialdata';
            $.getJSON(
                'clientFacade.cfc',
                {method:"get", returnFormat:"json", name:"foo"},
                function(d){
                    clientVal = d;
                    alert(clientVal);
                }
            );
            e.preventDefault();//prevent the button from doing anything else
        });

        //attach functionality to our set button
        $("#setValue").click(function(e){
            var success = false;
            var valu = $("#foo").val();
            $.getJSON(
                'clientFacade.cfc',
                {
                  method:"set",
                  returnFormat:"json",
                  name:"foo",
                  "val":valu
                },
                function(d){
                    success = eval(d);
                    if (!success){
                        alert('Was not able to set the client var :(');
                    }
                }
            );
            e.preventDefault();//prevent the button from doing anything else
        });
    });
</script>

Я думаю, это все, что вы хотели. Дайте мне знать, если я что-то пропустил.

2 голосов
/ 11 февраля 2009

Я ничего не знаю о CF, но обычно это делается путем отправки пары имя / значение на сервер, где сервер выбирает это значение и помещает его в переменную. Вы также можете использовать GET, если хотите, и можете делать обе эти вещи, используя AJAX. Другой глупый взлом состоит в том, чтобы сделать что-то подобное в JavaScript:

var img = new Image (); img.src = "http://myserver.com/something.cfm?name=value&anothername=anothervalue";

после этого сервер выполнит GET и передаст эти 2 значения серверу. изображение не будет отображаться на клиенте, потому что: а) вы не добавляете его в DOM; б) оно на самом деле не является изображением.

1 голос
/ 13 февраля 2009
1 голос
/ 11 февраля 2009

используйте CFAJAXPROXY (новый в CF8) и вызовите метод на вашем CFC, который устанавливает переменную в области видимости клиента.

0 голосов
/ 12 февраля 2009

Используйте jQuery, затем вы можете использовать метод getJSON() для отправки данных обратно в веб-сервисы CF (т.е. функции с access="remote") и возврата результатов обратно в JS.

С функциями CF8 returnformat="json" это приятно и просто.

(В более ранних версиях вам нужно использовать cfjson (или аналогичный) для преобразования данных.)

<Ч />

В качестве быстрого (и полностью непроверенного) примера ...

<cffunction name="MyRemoteFunc" returntype="Struct" access="remote" returnformat="json">
    <cfargument name="Name"      type="String"/>
    <cfargument name="Birthday"  type="Date"/>

    <cfset Session.UserDetails.Name = Arguments.Name />
    <cfset Session.UserDetails.Age  = DateDiff('yyyy',Now(),Arguments.Birthday) />
    <cfset Session.UserDetails.Id   = RandRange(1,100) />

    <cfreturn Session.UserDetails />
</cffunction>


<script type="text/javascript">

    function setUserDetails(name,birthday)
    { 
        $j.getJSON
            ( 'http://mydomain/stuff/remote.cfc?method=MyRemoteFunc'
            , { name:arguments.name , birthday:arguments.birthday }
            , setUserDetailsResponse
            );
    }

    function setUserDetailsResponse( result )
    {
        alert( 'Hello '+result.name+', you are '+result.age' years old and your Id is '+result.id+'.' );
    }

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