2009-05-24 5 views
3

cfselectをcfcにバインドするためにaccess = "remote"を使用すると、Init()コンストラクタを持つことができなくなります。cffunction Access =

<cfselect name="CityID" bind="cfc:Components.City.View1({StateID})" value="CityID" display="CityName" bindonload="yes" /> 

私はコンポーネントをインスタンス化するとき、私はそうのように、Init関数にデータソース名を渡すために使用しています:正確に、質問です

<cfcomponent> 
<cffunction name="Init"> 
<cfargument name="DS"> 

<cfset Variables.Instance.DS = arguments.DS> 
<cfreturn This> 
</cffunction> 

<cffunction name="View1"> 
<cfset var qry = ""> 

<cfquery name="qry" datasource="#Variables.Instance.DS.Datasource#"> 
SELECT * 
FROM Table 
</cfquery> 
<cfreturn qry> 
</cffunction> 
</cfcomponent> 

答えて

4

フィリップは、次のとおりです。

  1. はonApplicationStartでオブジェクトを作成し、これをApplicationスコープに格納します。これは、データソースの他の設定で初期化されます。
  2. 基本的に本物のスタブであるリモートプロキシCFCを作成し、そのCFCに選択フィールドをバインドします。

onApplicationStart:

<cffunction name="onApplicationStart"> 
    <cfset application.dsn = "myDSN" /> 
    <cfset application.cityFinder = createObject("component", "Components.City").init(application.dsn) /> 
</cffunction> 

とリモートプロキシCFC:私は必要な引数の型、などを指定してのベスト・プラクティス(すなわちの多くを残してきた

<cfcomponent displayName="CityFinderProxy"> 
    <cffunction name="View1"> 
    <cfargument name="StateId" /> 
    <cfreturn application.cityFinder.View1(argumentCollection=arguments) /> 
    </cffunction> 
</cfcomponent> 

注意)簡潔にするために、この例をコピーアンドペーストしないでください。私はちょうどそのアイデアを説明したかった。

+1

アダム、どのような素晴らしい返信です!それは非常に役に立ちます。私が今抱えている唯一の問題は、cfc内でApplicationスコープを使用していることです。 –

+0

リモートプロキシオブジェクトは特殊なケースです。私はこれよりも優れた実装にはまだ触れていない。 ColdSpringを使用してこれらのリモートプロキシを作成することもできますが、同じ方法で動作します。 http://coldspringframework.org/coldspring/examples/quickstart/index.cfm?page=remote –

+0

ストレージをパラメータ化します。依存性注入を使用してストレージメカニズムをCFCに渡し、次にCFC自体からVARIABLESスコープを使用します。 DI基礎のためのColdSpringフレームワークの読み込みをお勧めします。 –

2

何?

CFCをリモートに設定すると、基本的にはWebサービスになりますので、init()コンストラクタを使用しないのがよいでしょう。

application.cfcファイルのonApplicationStart部分で作成したアプリケーション/セッション変数にデータソース名を簡単に設定できます。

1

あなたの手に届かないものを呼び出す独自のリモートinit関数を作成したくない理由はありますか?

多分それをそうする痛みは、思考のためのただの食べ物です。私は通常、このシナリオでは何をすべきか

1

私たちが行ったこと:社内で開発されたコンポーネントのコンストラクタコードを禁止するソフトウェア開発標準が制定されました。これは、init()メソッドの単独の呼び出し(オプション)を除きます。いわゆるコンポーザーコード(cffunctionタグ内にないcfcomponentタグ内のもの)は、オブジェクトがインスタンス化されたとき、結果としてメソッドが実際に呼び出される前に実行されます。

<cfcomponent> 

    <cfset init() /> 

    <cffunction name="init"> 
    <cfset variables.message = "Hello, World" /> 
    <cfreturn this /> 
    </cffunction> 

    <cffunction name="remoteMethod" access="remote"> 
    <cfreturn variables.message /> 
    </cffunction> 

</cfcomponent> 
+0

これは良い考えですが、変数をコンストラクタに渡すことはできません。私は、データソースをinitに渡してvariables.instance.datasourceに移ることに慣れてきました。 –

+0

initメソッドにオプションのパラメータを確実に追加することができます。実際には、パラメータで渡す必要のある構造体の1つのオプションの引数を使用することをお勧めします。唯一の欠点は、initが2回呼び出されることです。 – Goyuix