2017-10-11 5 views
1

J'ai le code suivant qui crée d'abord un objet et ensuite il appelle une fonction appelée init.cffunction: second argument basé sur le premier argument

<cfset SESSION.objWatchlist = createObject("component", "path") /> 
<cfset SESSION.objWatchlist.init(session.addressid) /> 

Jusqu'ici tout va bien. La fonction init ressemble à ceci:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="addressID" type="numeric" required="true" /> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

Maintenant, je veux ajouter un autre argument à la fonction cffunction. Je l'appellerai comme ceci:

<cfset SESSION.objWatchlist.init("addressid", session.addressid) /> 

et

<cfset SESSION.objWatchlist.init("sessionid", session.sessionid) /> 

-je ajouter de nouvelles lignes dans le cffunction:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="typeOfID" type="string" required="true" /> 
    <cfif arguments.typeOfID eq "addressid"> 
    <cfargument name="addressID" type="numeric" required="true" /> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfelseif arguments.typeOfID eq "sessionid"> 
    <cfargument name="sessionID" type="string" required="true" /> 
    <cfset THIS.SESSIONID = arguments.sessionID /> 
    </cfif> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

Mais chaque fois que je reçois l'erreur « La balise doit être imbriquée dans une étiquette CFFUNCTION ".

Maintenant, ma question est de savoir comment puis-je écrire une fonction dans laquelle le second argument est basé sur le premier?

Est-ce encore possible?

Merci.

+0

Si vous avez des variables dans la portée 'this', déclarez-les en dehors d'une fonction. Vous pouvez leur donner des valeurs dans une fonction. En ce qui concerne la question actuelle, déclarez tous les arguments et transférez toute logique à plus tard dans la fonction. –

+0

@DanBracuk: Merci pour votre réponse. Avez-vous un exemple pour ça? – Wacki

+0

À un peu hors sujet. Ce type de code devrait être dans ''. Ce sera beaucoup plus facile à lire. –

Répondre

0

A la fin, je l'ai trouvé une solution qui ressemble à ce que:

D'abord, j'appelle la fonction:

<cfset SESSION.objWatchlist.init(addressID=session.addressid) /> 
<cfset SESSION.objWatchlist.init(sessionID=session.sessionid) /> 

J'ai changé la fonction suivante:

<cffunction name="init" access="remote" output="false"> 
    <cfargument name="addressID" type="numeric" required="false" />  
    <cfargument name="sessionID" type="string" required="false" /> 
    <cfif isDefined("arguments.addressid")> 
    <cfset THIS.ADDRESSID = arguments.addressID /> 
    <cfelseif isDefined("arguments.sessionid")> 
    <cfset THIS.SESSIONID = arguments.sessionid /> 
    </cfif> 
    <cfset THIS.WATCHLIST = arrayNew(1) /> 
    <cfset initWatchlistArray() /> 
    <cfreturn this /> 
</cffunction> 

Lorsque vous appelez la fonction je peux les appeler avec le nom de l'argument dans le cffunction. Ensuite, je peux vérifier lequel est défini.

+0

Juste pour ajouter une clarté (j'espère) à vos changements. Votre problème d'origine était que cfarguments ne peut être déclaré qu'en haut d'une fonction. Ils ne peuvent pas être imbriqués dans un conditionnel. A partir d'Adobe docs sur cfargument: "Cette balise doit figurer dans une balise cffunction, avant toute autre balise dans le corps de la balise cffunction." C'est pourquoi vous avez reçu l'erreur que vous avez faite. Je voudrais souligner que ce nouveau code pourrait accepter à la fois un paramètre addressID et un paramètre sessionID et si cela se produit, le sessionID ne sera pas défini car il est seulement défini si arguments.addressID n'est pas passé. –

0

Ceci est trop long pour un commentaire, mais j'ai un peu de nettoyage sur ce

SESSION.objWatchlist.init(addressID=session.addressid); 
SESSION.objWatchlist.init(sessionID=session.sessionid); 


any function init(numeric addressID, string sessionid) access="remote" output="false" { 

    if (arguments.keyexists(("addressid")) { THIS.ADDRESSID = arguments.addressID; } 
    else if (arguments.keyexists("sessionid") { THIS.SESSIONID = arguments.sessionid; } 

    THIS.WATCHLIST = []; 
    initWatchlistArray(); 
    return this; 
} 

Note: l'utilisation de .keyexists(). Ceci est une vérification plus rapide, car il ne doit pas regarder à travers chaque portée qui pourrait avoir quelque chose qui correspond.

Notez également qu'il est plus facile de masquer un tableau.