Доступ к функции = - PullRequest
4 голосов
/ 24 мая 2009

Если я использую access = "remote" для привязки cfselect к cfc, то я теряю возможность иметь конструктор Init ().

<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 ]

5 голосов
/ 24 мая 2009

Филипп, что я обычно делаю в этом сценарии:

  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>

Обратите внимание, что для краткости я пропустил множество рекомендаций (то есть, указав типы аргументов, необходимые и т. Д.), Поэтому не просто копируйте и вставляйте этот пример. Я просто хотел проиллюстрировать идею.

2 голосов
/ 24 мая 2009

Какой именно вопрос?

Установка CFC на remote в основном делает его веб-службой, поэтому я думаю, именно поэтому у вас не будет конструктора init ().

Вы можете легко установить имя источника данных в переменной application / session, которая создается в части onApplicationStart вашего файла application.cfc.

1 голос
/ 01 июня 2009

Что мы сделали: принял стандарт разработки программного обеспечения, который запрещает любой код конструктора в наших собственных разработанных компонентах, за исключением одного (необязательного) вызова метода init (). Так называемый код конструктора (все, что находится внутри тега cfcomponent, но не внутри тега cffunction), будет по-прежнему запускаться при создании экземпляра объекта и, как результат, до фактического вызова вашего метода.

<cfcomponent>

  <cfset init() />

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

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

</cfcomponent>
1 голос
/ 24 мая 2009

Есть ли причина, по которой вы можете не захотеть создавать свою собственную функцию удаленной инициализации, которая вызывает ту функцию, которую вы не можете получить?

Может быть, боль делать это таким образом ... просто пища для размышлений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...