我有一个Coldfusion8页面,其中我预先声明了一些变量:
<cfif (structKeyExists(url,"extern"))>
<cfset variables.someVar = "value">
<cfelse>
<cfset variables.someVar = "">
</cfif>
在此之后,我有许多模板,我正在加载:
<cfinclude template="templates/tmp_pagetop.cfm">
<cfoutput><head></cfoutput>
<cfinclude template="templates/tmp_pageheader.cfm">
...
我无法访问模板中的 variables.someVar 。
问题:
这是否可以使用变量范围?我不想使用会话或应用程序范围,因为我处理的变量实际上只应存在于相应的页面中。但我认为可以在页面中声明一次并在整个模板中引用。如果我不能使用变量,还有另一种方法吗?
修改
首先,感谢所有的反馈!
当我开始使用SO时,我通常会提出如下问题,但最终会减少到最低限度,因为我通常没有通过问题得到答案......可惜......我猜我可能会离开太多: - )
所以,如果有人想看看,我有一个名为search.cfm的页面。这个页面是一个shell页面,我通过AJAX和/或模板加载不同的布局。具体案例是通过AJAX加载的搜索表单。
所以这是3部分:
1)search.cfm 这里我检查Session.extern(al)是否有本地页面实例。如果它是本地实例,我会抓住用户在索引表单模板中加载时可以访问的变量A,B,C。
<cfif (structKeyExists(url,"extern"))>
<!--- preload external user data --->
<cfstoredproc procedure="proc_select_extern" datasource="dtb">
<cfprocparam type="in" value="#Session.extern#" cfsqltype="cf_sql_varchar" maxlength="13">
<cfprocresult name="external_user">
</cfstoredproc>
<!--- set external variables --->
<cfif external_user.recordcount eq 1>
<cfoutput query="external_user">
<cfscript>
// CULPRIT string
variables.user_modules = external_user.modules;
</cfscript>
</cfoutput>
<cfelse>
<!--- remove unknown URL params --->
<cfset StructDelete(Session, "Extern")>
</cfif>
</cfif>
然后在我的 app.js 中,我正在收听(Jquery-Mobile)pagebeforeshow事件,并通过AJAX将相应的表单加载到页面中:
$(document).on('pagebeforeshow', '#search' , function(e, data) {
// load main search form
if ( $(this).attr('val') != true ) {
$(this).attr('val') == true;
// here I'm calling the default search form
ajaxUpdate( "../layouts/tmp_searcher.cfm", $('.searchFromWrapper'), "search", "default", "search" );
}
....
var ajaxUpdate =
function update( from, target, param, account, bindings ) {
$.mobile.loading( 'show' );
$.ajax({
async: true, type: 'GET', returnFormat: 'json',
data: { value: param, type: account },
url: from, timeout: 7500,
success: function(data) {
var makeUp = !$.support.touch ? data.replace("<select", "<select data-native-menu='false' ") : data;
target.addClass('.fade.out')
.html( makeUp )
...
});
正在加载的 tmp_searcher.cfm 模板包含所有搜索表单变体。在初始加载时,我会抓住基本的或基于外部的(userID)。
它位于tmp_searcher.cfm中,我无法再访问 variables.XXX ...与我之前的问题中的URL相同....哦,好吧,把它写下来排序有道理的,为什么它不起作用; - )
我为您省去了详细信息,tmp_searcher.cfm中的第一行是:
<cfdump output="D:\ColdFusion8\logs\dump.txt" label="catch" var="#variables.user_module#">
哪个转储没有,(@ Leigh)抛出错误:
Element USER_MODULE is undefined in VARIABLES
所以,我的问题应该是:
如果内容在同一页面上并且我不想使用会话或应用程序范围,那么Coldfusion变量是否有办法通过AJAX调用持续存在?
答案 0 :(得分:1)
您可以使用请求范围。这将允许您访问请求中的任何变量,包括模板。
但我使用它的方法是使用带有前缀的cfimport ...“ui”
<cfimport taglib="templates" prefix="ui">
<ui:tmp_pagetop heyLookAVar="#myvar# >
然后在您的模板中,您可以访问attributes.heyLookAVar
您可以非常喜欢并检测模板调用标记是结束还是开始......那么您只需要一个
<ui:page>
my page
</ui:page>