2

Baseという次のコンポーネントがあるとします。

<cfcomponent output="false">

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

Adminという別のコンポーネントでベースを拡張したい:

<cfcomponent output="false" extends="Base">
</cfcomponent>

オブジェクトを作成するときに次のようにすると、アプリケーション内で次のようになります。

<cfset obj = createobject("component", "Admin").init()>
<cfdump var="#obj.getmeta()#">

返されたメタデータは、コンポーネントの名前がAdminであり、それがBaseコンポーネントを拡張していることを示しています。これで問題ありませんが、オブジェクトを作成するときにinit()メソッドを明示的に呼び出す必要はありません。

Baseコンポーネントで次のようなことができればいいのですが。

<cfcomponent output="false">

    <cfset init()>

    <cffunction name="init" access="public" returntype="Any" output="false">
        <cfset variables.metadata = getmetadata(this)>
        <cfreturn this>
    </cffunction>

    <cffunction name="getmeta" access="public" returntype="Any" output="false">
        <cfreturn variables.metadata>
    </cffunction>

</cfcomponent>

ただし、 getmeta() メソッドによって返されるメタデータは、コンポーネント名がまだ拡張中であるにもかかわらずBaseであることを示しています。これを達成する方法について何か考えはありますか?

4

3 に答える 3

1

各拡張cfcでinitを呼び出したくない理由はありますか?

<cfcomponent output="false" extends="Base">
    <cfset super.init()>

</cfcomponent>

それはあなたが望むようにメタデータを投入するようです。

于 2008-12-12T20:50:22.680 に答える
1

あなたが何を望んでいるかは 100% わかりませんが、ColdFusion 8 では、インスタンス化された CFC を要求する代わりに、CFC へのドット表記パスを取る getComponentMetaData() 関数が追加されました。Base で init() を呼び出さずに getComponentMetaData() に渡すことができる Admin からパスを取得できるはずです。

ColdFusion LiveDoc: getComponentMetaData()

于 2008-12-17T16:20:39.833 に答える