Ajax-вызов в ModelGlue ColdFusion Application без визуализации представления
Я использую Ajax с ModelGlue в приложении ColdFusion. Я хочу сделать Ajax-вызов, чтобы вернуть значение. Я не хочу делать какие-либо представления. Я просто хочу взаимодействия с базой данных и вернуть значение.
Мой звонок по Ajax:
new Ajax.Request(root+'test.testFunction',{
method: 'post',
parameters: {param1:paramval},
onSuccess: function(response){
alert(response.responseText);
var myresult = response.responseText;
}
});
мое событие склеивания модели:
<event-handler name="test.testFunction">
<broadcasts>
<message name="testFunction" />
</broadcasts>
</event-handler>
и моя функция контроллера:
<cffunction name="testFunction" returnType="any" output="true" >
<cfargument name="event" type="any" required="true">
<cfset justtest = 1>
<cfreturn justtest>
</cffunction>
Я использую прототип в качестве моей библиотеки AJAX.
Когда я предупреждаю responseText, я получаю нулевое значение. Это bcoz? Я не включил часть представления в обработчик событий? Если я включил часть просмотра, то я должен был бы создать новую страницу, которую я не хочу делать. Можно ли получить только значение сервера с помощью вызова AJAX без рендеринга? Я хочу, чтобы myresult имел значение 1 в соответствии с приведенным выше сценарием.
Пожалуйста, помогите. Спасибо за любую помощь.
4 ответа
Попробуйте использовать это в конце вашей функции контроллера:
<CFCONTENT TYPE="text" RESET="Yes"><CFOUTPUT>#serializeJSON(justTest)#
<cfset request.modelGlueSuppressDebugging = true />
<cfsetting showdebugoutput="false" /></CFOUTPUT><cfabort>
Ну вот так:
<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>
Это сохранит ваш текущий вид и вернет 'justTest' как json.
Если вы используете Firefox, вы сможете увидеть ответ от сервера.
Когда вы говорите, что "просто хотите вернуть значение" - это ваше "мнение". То, что вы хотите сделать, это использовать специальное представление для вашего удаленного (ajax) события, которое просто выплевывает значение. Например, если вы хотите, чтобы он возвращал JSON, вы можете сделать это:
Конфигурация события:
<event-handler name="test.testFunction">
<broadcasts>
<message name="testFunction" />
</broadcasts>
<views>
<include name="body" template="renderJson.cfm" />
</views>
</event-handler>
Функция контроллера:
<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>
Если вы используете Model-Glue 3, вы можете использовать новую функцию " Форматы событий" для привязки этого представления Ajax к существующему событию, которое делает то же самое для другого формата представления.
ВНИМАНИЕ: если Coldfusion 8 и OnRequest() в application.cfc, может быть связана известная ошибка cf8. Обходной путь см. По http://www.coldfusionjedi.com/index.cfm/2008/3/19/Ask-a-Jedi-Ajaxbound-requests-and-onRequest
В этой ситуации вы действительно должны вызывать удаленный прокси вашего сервиса, минуя инфраструктуру MVC.:)
О, и не забудьте, что вы можете использовать <cfajaxproxy>
если вы используете CF8.