2016-02-10 3 views
1

Использование CF 10. Чтобы повторно заполнить выбор без обновления всей страницы, я делаю удаленный вызов cfc при изменении выбора, который запускает запрос и возвращает его в формате JSON. В моем обратном вызове $ .post() я беру этот текст JSON и сразу же использую JSON.parse(), чтобы преобразовать его в объект JS. Итак, теперь у меня есть объект JS, содержащий 2 массива: COLUMNS, который является массивом всех имен столбцов, и DATA, который представляет собой массив массивов, каждый массив представляет строку в запросе. Поэтому каждое поле в запросе - DATA [rownumber] [columnnumber].Как использовать JSON, возвращаемый с ajax coldfusion cfc call

То, что я пытаюсь выяснить, является самым элегантным способом обработки этого объекта JS. я могу просто просто перебрать его с помощью $ .each() и заполнить параметры select, но что, если я хочу сортировать набор результатов по одному или нескольким столбцам? Или обратитесь к полям по имени их столбца? Мне интересно, лучше ли мне что-то делать внутри cfc, прежде чем возвращать qry, например, преобразовать его в структуру. Ниже приведен мой код функции cfc:

<cffunction name="getStaffRemote" access="remote" returntype="query" returnformat="JSON" output="false"> 
    <cfargument name="iEmpId" type="any" required="false" /> 

    <cfset var qry= "" /> 

    <cfquery name="qry" datasource="#this.DSN#"> 
     SELECT iEmpid, vEmpLname, vEmpFname, isActive 
     FROM tEmployees 
     where 1=1 
     <cfif isDefined("arguments.iEmpId") AND isNumeric(arguments.iEmpId) AND arguments.iEmpId GT 0> 
      AND iEmpId = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.iEmpId#" /> 
     </cfif> 
    </cfquery> 

    <cfreturn qry /> 

</cffunction> 

Спасибо за ваши мысли. Кстати, мне также интересно, почему запрос принимает this.DSN, который является просто копией application.dsn. Я думал, что переменные области приложения недоступны для функции, когда она вызывается непосредственно удаленным, то есть «$ .post ('myCFC.cfc? Method = getStaffRemote & ...'"

(Ответить на ответ):.

Очень приятно - спасибо, я буду помнить это для больших запросов в этом случае, я в конечном итоге с помощью возвращаемого JSON как с JQuery - просто сделать, так как есть только несколько столбцов:

$.get("cfc/employees.cfc?method=getStaffRemote&vActive=" + vActive, 
       function(jsonText){ 
        var qryStaff = JSON.parse(jsonText); 

        //qryStaff is now an object with 2 arrays: COLUMNS and DATA. 
        //COLUMNS is an array of strings of the column names. 
        //DATA is an array of arrays, where each array is a row. 
        //Thus, every data cell is DATA[rownumber][columnnumber] 
        //[0] = iEmpId 
        //[1] = vEmpLName 
        //[2] = vEmpFName 
        //[3] = isActive 

        $('#iEmpID_Staff').empty(); 
        $.each(qryStaff.DATA, function() { 
         $('#iEmpID_Staff').append('<option value=' + $(this)[0] + '>' + $(this)[1] + ', ' + $(this)[2] + '</option>'); 
        }); 
       } 
      ); 
+0

Я не вижу никаких переменных области приложения. Что касается вопроса сортировки, я предлагаю сделать это в запросе. Если есть условная логика, передайте соответствующий аргумент функции. –

+0

Завершите запрос на стороне сервера и выполните что-то вроде 'ArrayAppend (local.retArray, {col1 = qry.col1, cols2 = qry.col2})' возвращаем массив вместо запроса. –

+0

(Edit) Если вам нужны результаты, отсортированные определенным способом, используйте массивы или запрос. Структуры не имеют гарантированного порядка сортировки. – Leigh

ответ

1

JSON, созданный ColdFusion при сериализации объекта запроса, не самый приятный для работы. То, что я часто делаю, это преобразовать запрос в n массив структур и вернуть это. Вы получите большую полезную нагрузку JSON, так как имена столбцов будут повторяться, но если у вас включен gzip, но вам нужно будет рассмотреть, сколько данных у вас есть, и является ли это хорошим решением в этом случае, но стоит учесть, так что ваши передний конец дэвы получить JSON в здравом формате :)

что-то вроде этого следует сделать это:

<cffunction name="getStaffRemote" access="remote" returntype="query" returnformat="JSON" output="false"> 
    <cfargument name="iEmpId" type="any" required="false" /> 

    <cfset var qry= "" /> 

    <cfquery name="qry" datasource="#this.DSN#"> 
     SELECT iEmpid, vEmpLname, vEmpFname, isActive 
     FROM tEmployees 
     where 1=1 
     <cfif StructKeyExists(arguments, "iEmpId") AND isNumeric(arguments.iEmpId) AND arguments.iEmpId GT 0> 
      AND iEmpId = <cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.iEmpId#" /> 
     </cfif> 
    </cfquery> 

    <cfscript> 
     var result = []; 
     for (var row in qry) { 
      arrayAppend(result, row); 
     } 
     return result; 
    </cfscript> 

</cffunction> 

это будет возвращать JSON, который выглядит примерно так:

[ 
    {"IEMPID":1, "VEMPLNAME":"Bloggs", "VEMPFNAME":"Jo", "ISACTIVE": true}, 
    {"IEMPID":2, "VEMPLNAME":"Smith", "VEMPFNAME":"Sam", "ISACTIVE": true} 
] 

Теперь сортировка в JS становится намного проще, чем вы можете:

myArray.sort(function(a, b) { 
    return something; // do your compare here 
}); 

Вы можете в качестве альтернативы передать столбец, который вы хотите отсортировать в качестве 2-го аргумента вашего метода getStaffRemote и добавить или пункт. Вам нужно будет защитить это от атак SQL-инъекций, если вы идете по этому маршруту.

+0

FWIW, с CF11 вы можете вернуть более удобный формат структуры, включив его в свой Application.cfc: ['this.serialization.serializeQueryAs =" struct ";'] (https: //helpx.adobe. ком/ColdFusion/CFML-справочник/ColdFusion-функция/функция-с/serializejson.html). – Leigh

+0

Очень приятно - спасибо! Я закончил использовать возвращенный JSON с jQuery - просто сделать, поскольку есть только несколько столбцов: – Cmaso

Смежные вопросы