2009-05-24 4 views
3

cfselect를 cfc에 바인딩하기 위해 access = "remote"를 사용하면 Init() 생성자를 사용할 수 없게됩니다.cffunction Access =

<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의 객체를 생성하고,이 응용 프로그램 범위에 저장합니다. 이 위치에서 데이터 소스의 다른 설정으로 초기화합니다.
  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

가 정확히 질문 무엇인가

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

난 구성 요소를 인스턴스화 할 때과 같이, 초기화 함수에 데이터 소스의 이름을 전달하는 데 사용 해요?

CFC를 원격으로 설정하면 기본적으로 웹 서비스가되므로 init() 생성자가없는 것입니다.

application.cfc 파일의 onApplicationStart 부분에서 만든 응용 프로그램/세션 변수에 데이터 소스 이름을 쉽게 설정할 수 있습니다.

1

당신이 당신을 위해 당신이 도달 할 수없는 것을 호출하는 당신 자신의 원격 초기화 함수를 만들고 싶지 않을 이유가 있습니까?

어쩌면 그렇게하는 것이 고통입니다. 생각을위한 바로 음식. 나는 보통이 시나리오에서 무엇을

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

이것은 좋은 생각이지만 생성자에 변수를 전달하는 것을 처리하지 않습니다. variables.instance.datasource를 채우기 위해 데이터 소스를 init에 전달하는 데 익숙해졌습니다. –

+0

init 메소드에 선택적 매개 변수를 확실히 추가 할 수 있습니다. 실제로 매개 변수로 전달해야하는 구조체 인 하나의 선택적 인수를 선호하며이를 통해 필요한 다른 모든 데이터를 전달할 수 있습니다. 유일한 단점은 init가 두 번 호출된다는 것입니다. – Goyuix