Как заполнить массив Jquery и объекты DOM из результата CF C - PullRequest
0 голосов
/ 19 марта 2020

У меня есть следующая проблема, и я надеюсь, что кто-то здесь может подсказать мне более подходящее решение. Сначала я пытаюсь заполнить 12 объектов формы из результатов вызова CF C в ajax. Я, если / иначе над возвращенным набором и заполняя каждое значение объекта DOM по его описанию, возвращенному из CF C, должен быть более простой c способ сделать это. Позвольте мне показать вам компоненты поддержки, а затем вызов ajax, который, я думаю, мог бы быть лучше;

getValue () используется в jQueryUtils. js для вызова SessionMgr.cf c для получения сеанса значение переменной;

function getValue(a) {
    var result = undefined;

        $.ajax({
                url: "cfc/SessionMgr.cfc",
                async: false,
                type: "get",
                dataType: "text",
                data: {
                    method: "getValue",
                    variablename: a
                },
              success: function(response) {
                  result = response;
                  //console.log('getValue: ', a , ' value: ' , response);
              },
              error: function(jqXHR, status, error) {
                  console.log('Error Occurred');
                  console.log(error);
              }
          });
    return result;
 }

, вызывающее SessionMgr.cfc;

<cffunction name="getValue" access="remote" returntype="string" returnformat="plain" output="yes" hint="I get the value of the given user-specific variable.">
    <cfargument name="variablename" type="string" required="yes">
    <cfreturn session[arguments.variableName] />
</cffunction>

, затем следующий вызов функции;

function getAllNodeValues() {

    var lID =        getValue('lID');
    var nID =        getValue('nID');
    var rLocation =  getValue('rLocation');
    var rMonth =     getValue('rMonth');
    var rYear =      getValue('rYear');
    var rStartDate = getValue('rStartDate');
    var rEndDate =   getValue('rEndDate');

        $.ajax({
            url: "cfc/Nodes.cfc",
            type: "get",
            async: false,
            dataType: "json",
            data: {
                Method: "GetAllNodeValues",
                LineID: lID,
                LineNodeID: nID,
                DCID: rLocation,
                Month: rMonth,
                Year: rYear,
                StartDate: rStartDate,
                EndDate: rEndDate
            },
          success: function(response) {
              $.each(response.DATA, function(i, row) {
                  // get value of first row as descriptions;
                  var val = row[0];
                  var descr = row[1];
                  // append new options
                  if(descr == 'IsActive') {
                      $('#cboNodeIsActive').val(val);
                  } else if(descr == 'OpCode') {
                      $('#cboNodeOpCode').val(val);
                  } else if(descr == 'IsUnits') {
                      $('#txtNodeIsUnits').val(val);
                  } else if(descr == 'Fractal') {
                      $('#cboNodeFractal').val(val);
                  } else if(descr == 'Ordinal') {
                      $('#txtNodeOrdinal').val(val);
                  } else if(descr == 'ParentID') {
                      $('#cboNodeParentID').val(val);
                  } else if(descr == 'Constant') {
                      $('#cboNodeConstant').val(val);
                  } else if(descr == 'ConstantValue') {
                      $('#txtNodeConstantValue').val(val);
                  } else if(descr == 'CurrentBalance') {
                      $('#txtNodeCurrentBalance').val(val);
                  } else if(descr == 'EndingBalance'){
                      $('#xtxNodeEndingBalance').val(val);
                  } else if(descr == 'CurrentUnits'){
                      $('#txtNodeCurrentUnits').val(val)
                  } else if(descr == 'EndingUnits'){
                      $('#txtNodeEndingUnits').val(val);
                  }
              });
          },
          error: function(msg) {
              console.log(msg);
          }
      });   
    }

возвращает этот набор данных; ReturnedDataset Из-за соглашения об именах моих объектов DOM, похоже, что единственный способ установить их - это если / else'ing во время события $ .each (). Если у кого-то есть лучший способ перейти непосредственно к массиву или какие-либо улучшения по сравнению с тем, как это делается здесь, приветствуется.

, поэтому возвращаемый объект JSON имеет COLUMNS и DATA, как мне это сделать? оцените COLUMNS в if / else, а затем получите значение DATA, соответствующее ссылке на массив?

, поэтому я добавил это к своему успеху: обратный вызов;

 var i = 0;
              var col = [];
              var dat = [];
              col = response.COLUMNS;
              dat = response.DATA;
              console.log('col ', col);
              console.log('dat ',dat);

и это результаты консоли: consoleDump

я не понимаю, почему DATA вложил слой глубже COLUMNS, а затем как сопоставить имя столбца со значением в данных в пары, которые я могу оценить один и установить мой объект DOM для другого?

1 Ответ

2 голосов
/ 19 марта 2020

что я не понимаю, так это почему DATA вложил слой глубже, чем COLUMNS, и как мне сопоставить имя столбца со значением в данных в пары, чтобы я мог их оценить и установить для моего объекта DOM значение другой?

Сериализация JSON в ColdFusion связана с виджетами пользовательского интерфейса, которые поставляются вместе с ним. Большинство разработчиков отошли от этих тегов пользовательского интерфейса, но проблема заключается в преобразовании объекта запроса в более стандартный формат JSON. Я создал CF C для обработки этого .

serializeJSON( someQuery )

вернется в следующем формате:

{
  "COLUMNS":["BOOKID","TITLE","GENRE"],
  "DATA":[
    [8,"Apparition Man","Fiction"],
    [2,"Shopping Mart Mania","Non-fiction"]
  ]
}

Этот CF C преобразует объект запроса в массив массивов или массив структур (JSON объекты) :

{
  "data":[
    {"bookid":8,"genre":"Fiction","title":"Apparition Man"},
    {"bookid":2,"genre":"Non-fiction","title":"Shopping Mart Mania"}
  ]
}

По умолчанию CF C строчные буквы всех имен столбцов. Вы можете настроить его, чтобы сохранить имена столбцов в их текущем регистре, если хотите. Затем можно использовать jQuery, чтобы выбрать все поля в форме по идентификатору формы и сопоставить ключи JSON с идентификаторами полей. Я уверен, что есть и другие способы выполнить sh эту задачу без ручного сопоставления данных с полями по одному.

...