0

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へのアクセスに問題があります。

質問:変数スコープ
を使用して、これはまったく可能ですか? 私が扱っている変数は実際にはそれぞれのページにのみ存在するはずなので、セッションまたはアプリケーションスコープを使用したくありません。しかし、ページ内で 1 回宣言して、テンプレート全体で参照することは可能だと思いました。変数を使用できない場合、別の方法はありますか?

編集:
まず、すべてのフィードバックに感謝します!

私がSOを使い始めた頃は、以下のような質問をすることが多かったのですが、たいていは質問をくぐり抜けて答えが得られなかったので、最小限に減らしてしまいました...残念...私も去るかもしれませんずっと離れています:-)

ですから、誰かが見たい場合は、search.cfm というページがあります。このページは、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 の内部にあり、変数.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

だから、私の質問は次のようになっているはずです:

コンテンツが同じページにあり、Session または Application Scope を使用したくない場合、Coldfusion 変数を AJAX 呼び出しで保持する方法はありますか?

4

1 に答える 1

1

リクエストスコープを使用できます。これにより、テンプレートを含む、リクエスト内のすべての変数にアクセスできるようになります。

しかし、私がそれを行うために使用する方法は、.."ui"のようなプレフィックスを付けてcfimportを使用することでした。

<cfimport taglib="templates" prefix="ui">
<ui:tmp_pagetop heyLookAVar="#myvar# >

次に、テンプレート内でアクセスできますattributes.heyLookAVar

あなたは本当に空想を得て、テンプレート呼び出しタグが終了しているか開始しているかを検出することができます...そしてあなたは1つだけ必要です

<ui:page>
   my page
</ui:page>
于 2012-06-12T17:13:05.387 に答える