2009-08-06 5 views
1

Ich verwende Ajax mit ModelGlue in einer ColdFusion-Anwendung. Ich möchte einen Ajax-Aufruf ausführen, um einen Wert zurückzugeben. Ich will keinen Blick rendern. Ich möchte nur eine Datenbankinteraktion und einen Wert zurückbringen.Ajax-Aufruf in ModelGlue ColdFusion Anwendung ohne Rendering einer Ansicht

Mein Ajax-Aufruf:

new Ajax.Request(root+'test.testFunction',{ 
    method: 'post', 
    parameters: {param1:paramval}, 
    onSuccess: function(response){ 
    alert(response.responseText); 
    var myresult = response.responseText; 
    } 
}); 

meine modelglue Veranstaltung:

<event-handler name="test.testFunction"> 
    <broadcasts> 
      <message name="testFunction" /> 
    </broadcasts> 
</event-handler> 

und meine Controller-Funktion:

<cffunction name="testFunction" returnType="any" output="true" > 
    <cfargument name="event" type="any" required="true"> 
     <cfset justtest = 1> 
    <cfreturn justtest> 
</cffunction> 

I Prototyp als meine Ajax-Bibliothek verwenden.

Wenn ich den responseText alarmiere, bekomme ich null Wert. Ist das bcoz Ich habe nicht den View-Teil in der Event-Handler enthalten? Wenn ich den View-Teil mit einschließe, müsste ich eine neue Seite erstellen, die ich nicht machen möchte. Ist es möglich, nur einen Serverwert durch einen AJAX-Aufruf zu erhalten, ohne eine Sicht zu rendern? Ich möchte MyResult Wert wie 1 nach dem obigen Szenario haben.

Pls Hilfe. Thnx für jede Hilfe.

Antwort

1

Versuchen Sie, diese am Ende der Controller-Funktion:

<CFCONTENT TYPE="text" RESET="Yes"><CFOUTPUT>#serializeJSON(justTest)# 
<cfset request.modelGlueSuppressDebugging = true /> 
<cfsetting showdebugoutput="false" /></CFOUTPUT><cfabort> 

So wie folgt aus:

<cffunction name="testFunction" returnType="any" output="true" >  
<cfargument name="event" type="any" required="true">   

<cfset justtest = 1> 

<CFCONTENT TYPE="text" RESET="Yes"><CFOUTPUT>#serializeJSON(justTest)# 
<cfset request.modelGlueSuppressDebugging = true /> 
<cfsetting showdebugoutput="false" /></CFOUTPUT><cfabort> 

</cffunction> 

Dies wird Ihre aktuelle Ansicht und zurück zu halten 'justTest' als json.

Wenn Sie Firefox verwenden, sollten Sie in der Lage sein, die Antwort vom Server zu sehen.

+0

@Masterbuddha ... thnx ..es hat funktioniert ... du bist ein verdammt guter Programmierer..Wenn ich das richtig verstehe, gibt die Funktion nichts zurück, aber stattdessen gibt der Server die Daten in Form von cfcontent zurück. Der cfcontect dient in diesem Fall tatsächlich als Sichtweise. Hab ich recht? sowieso thnx viel mann ..... – ajithmanmu

+1

Etwas über diese Lösung reibt mich wirklich in die falsche Richtung. Wenn Sie den Model-Glue-Ereignis-Lebenszyklus unterbrechen möchten, warum sollten Sie zuerst ein Model-Glue-Ereignis verwenden? In diesem Fall würde ich tun, wie Henry vorgeschlagen hat und nur einen Remote-Proxy verwenden. –

3

Wenn Sie sagen "Sie wollen nur einen Wert zurückbringen" - das ist Ihre "Ansicht". Was Sie tun möchten, ist eine spezielle Ansicht für Ihr Remote (Ajax) -Ereignis, die nur den Wert ausspuckt. Zum Beispiel, wenn Sie es JSON zurückgeben möchten, können Sie dies tun:

Event Configuration:

<event-handler name="test.testFunction"> 
    <broadcasts> 
      <message name="testFunction" /> 
    </broadcasts> 
    <views> 
      <include name="body" template="renderJson.cfm" /> 
    </views> 
</event-handler> 

Reglerfunktion:

<cffunction name="testFunction" returnType="any" output="true" > 
    <cfargument name="event" type="any" required="true"> 
    <cfset event.setValue('justtest', 1) /> 
</cffunction> 

renderJson.cfm:

<cfoutput>#serializeJson(event.getValue('justtest'))#</cfoutput> 

Wenn Sie Model-Glue 3 verwenden, können Sie die neue Event Formats-Funktion verwenden, um diese AJAX-Ansicht auf ein vorhandenes Ereignis zu kopieren, das dasselbe für ein anderes Ansichtsformat tut.

-1

In dieser Situation sollten Sie wirklich den Remote-Proxy Ihres Dienstes aufrufen und das MVC-Framework umgehen. :)

Oh, und vergessen Sie nicht, Sie können <cfajaxproxy> verwenden, wenn Sie CF8 verwenden.

+0

Das schien nicht der Konsens in Ihrer Frage – Antony

+0

Es kommt darauf an. In diesem Fall ist es sinnvoll, die aktuelle Methode aufzurufen. – Henry

Verwandte Themen