Использование CFGRID с JQuery
Я столкнулся с проблемой использования CFGRID с JQuery. Вот примеры кодов, использующих базу данных CFARTGALLERY:
gridtest.cfm
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<cfajaximport tags="cfform,cfgrid">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>CFGRID Test</title>
</head>
<cfinvoke component="gridtest" method="getartistname" returnvariable="artistname" />
<body>
<cfform name="frmArtists" format="html">
<cfselect name="selArtist" query="artistname" queryPosition="below" display="lastname" value="artistid">
<option value="0">Select artist...</option>
</cfselect>
<p></p>
<cfgrid name="artgrid"
bind="cfc:gridtest.getartname({cfgridpage},
{cfgridpagesize},
{cfgridsortcolumn},
{cfgridsortdirection},
{selArtist})"
format="html"
pagesize="8"
bindOnLoad="false"
selectmode="browse"
width="400">
<cfgridcolumn name="artname" header="Art Name" display="yes" width="400">
</cfgrid>
</cfform>
</body>
</html>
Он имеет простой элемент управления cfselect для выбора имени художника, а при щелчке по cfgrid отображаются имена произведений искусства.
Вот CFC (gridtest.cfc):
<cfcomponent>
<cfset application.datasource="cfartgallery">
<cfset cfartgallery=#application.datasource#>
<cffunction name="getArtistName" access="public" returntype="query">
<cfquery name="artistname" datasource="#cfartgallery#">
SELECT ARTISTID,LASTNAME
FROM ARTISTS
ORDER BY LASTNAME
</cfquery>
<cfreturn artistname>
</cffunction>
<cffunction name="getartname" access="remote" returntype="struct">
<cfargument name="page" type="numeric" required="true">
<cfargument name="pagesize" type="numeric" required="true">
<cfargument name="pagesortcolumn" type="string" required="false" default="">
<cfargument name="pagesortdir" type="string" required="false" default="">
<cfargument name="artistid" type="numeric" required="yes">
<cfset var artname="">
<cfquery name="artname" datasource="#cfartgallery#">
SELECT ARTNAME
FROM ART
WHERE ARTISTID=<cfqueryparam cfsqltype="cf_sql_integer" value="#arguments.artistid#">
</cfquery>
<cfreturn QueryConvertForGrid(artname,page,pagesize)>
</cffunction>
</cfcomponent>
Все идет нормально. Но если я использую страницу-обертку, используя функцию загрузки JQuery, например так (gridtestmain.cfm):
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>
<script type="text/javascript">
$(document).ready(function(){
$('#div1').load('gridtest.cfm');
});
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>CFGRID Test Under JQuery</title>
</head>
<body>
<div id="div1">
</div>
</body>
</html>
Cfgrid исчезает только с рамкой границы. В IE он сообщает об ошибке "Ext.EventObject имеет значение null или не является объектом". Поиск в сети говорит о том, что библиотека Ext загружалась несколько раз, вызывая проблему, но я не могу видеть, куда она загружается более одного раза.
Это ограничение JQuery? Или я делаю это неправильно? Любые предложения очень ценятся.
1 ответ
В данный момент у меня нет доступа к CF-серверу, поэтому все могут поправить меня, если я ошибаюсь.
IIRC, когда вы создаете CFForm, CF обрабатывает блок HEAD для добавления соответствующих файлов EXT JavaScript. Однако в этом случае вы загружаете cfm как раздел страницы, а не как целую страницу, поэтому второй (загруженный) блок HEAD не обрабатывается браузером.
Я бы попробовал пару вещей, чтобы увидеть, что работает лучше всего:
1) Оберните div, который вы загружаете, в CFForm вместо того, чтобы помещать его в удаленный раздел.
2) Создайте пустой, неиспользованный CFForm на родительской странице, чтобы для этого был загружен соответствующий JS.
Хотя, если я правильно помню, вам не нужно полное определение страницы (теги HEAD, BODY и т. Д.) В подразделе, который вы загружаете. Вам нужна только разметка, которую вы хотите отобразить. Информация HEAD и др. Будет на странице вызова.