0 Replies Latest reply on Nov 10, 2016 2:24 PM by Chris LeJeune

    Binding a cfgrid to a cfc throws js error when the cfc returns an empty dataset in CF 2016

    Chris LeJeune

      I'm having a problem in CF 2016 with a grid I'm trying to populate with a bound cfc method.  If my method returns no data, I get a JavaScript error: ext-all.js:18 Uncaught TypeError: Cannot read property 'id' of undefined(…).  However, this code executes fine in CF 9.

       

      Is this a bug?  Or should I be doing something different in CF 2016 to handle a method that returns no data?

       

      My exact version is 2016.0.0.298074.

       

      Below is the code I'm testing with.  First, the page with the cfgrid:

      <cfajaximport tags="cfform,cfpod,cfdiv,cfgrid" />

      <h1>Invoke method</h1>

      <cfinvoke component="data" method="getColors" returnvariable="qColors">

      <cfdump var="#qColors#" label="invoked method">

       

      <h1>Bind method</h1>

      <cfform id="frmColors">
           <cfgrid name="grdColors" format="html" pagesize="5"
                bind="cfc:data.getColorsRemote({cfgridpage},{cfgridpagesize},{cfgridsortcolumn},{cfgridso rtdirection})">

                <cfgridcolumn name="COLOR" header="Color" width="300">
                <cfgridcolumn name="ALT" header="Spanish" width="300">
           </cfgrid>
      </cfform>

       

      And this is the component: data.cfc

      <cfcomponent output="false" displayname="data">

           <cffunction name="getColors" access="public" returntype="query" output="false">
                <cfset var q = 0>
                <cfset qColors = getDataSet()>
                <cfquery dbtype="query" name="q">
                     SELECT COLOR, ALT FROM qColors
                          ORDER BY COLOR ASC
                </cfquery>
                <cfreturn q>
           </cffunction>

       

           <cffunction name="getColorsRemote" access="remote" returntype="struct" output="false">
                <cfargument name="page" type="numeric" required="true">
                <cfargument name="pageSize" type="numeric" required="true">
                <cfargument name="gridSortColumn" type="string" required="false" default="">
                <cfargument name="gridSortDir" type="string" required="false" default="">

                <cfparam name="arguments.gridSortColumn" default="COLOR">
                <cfparam name="arguments.gridSortDirection" default="ASC">

                <cfset var q = 0>

                <cfset qColors = getDataSet()>
                <cfquery dbtype="query" name="q">
                     SELECT COLOR, ALT FROM qColors
                          <cfif arguments.gridSortColumn NEQ "" AND arguments.gridSortDir NEQ "">
                               ORDER BY #arguments.gridSortColumn# #arguments.gridSortDir#
                          </cfif>
                </cfquery>

                <cfreturn queryConvertForGrid(q, arguments.page, arguments.pageSize)>
           </cffunction>

       

           <cffunction name="getDataSet" access="private" returntype="query" output="false">
                <!--- create dataset --->
                <cfset qColors = queryNew("COLOR, ALT","VarChar, VarChar")>

                <!--- comment out this section to simulate no data --->

                <cfset newRow = queryAddRow(qColors, 7)>
                <cfset temp = querySetCell(qColors, "COLOR", "Red", 1)>
                <cfset temp = querySetCell(qColors, "ALT", "Rojo", 1)>
                <cfset temp = querySetCell(qColors, "COLOR", "Orange", 2)>
                <cfset temp = querySetCell(qColors, "ALT", "Naranja", 2)>
                <cfset temp = querySetCell(qColors, "COLOR", "Yellow", 3)>
                <cfset temp = querySetCell(qColors, "ALT", "Amarillo", 3)>
                <cfset temp = querySetCell(qColors, "COLOR", "Green", 4)>
                <cfset temp = querySetCell(qColors, "ALT", "Verde", 4)>
                <cfset temp = querySetCell(qColors, "COLOR", "Blue", 5)>
                <cfset temp = querySetCell(qColors, "ALT", "Azul", 5)>
                <cfset temp = querySetCell(qColors, "COLOR", "Indigo", 6)>
                <cfset temp = querySetCell(qColors, "ALT", "Indigo", 6)>
                <cfset temp = querySetCell(qColors, "COLOR", "Violet", 7)>
                <cfset temp = querySetCell(qColors, "ALT", "Violeta", 7)>

                <!--- end comment --->

                <cfreturn qColors>
           </cffunction>

      </cfcomponent>