Wie kann man eine Methode aus einer anderen Komponente mit cfscript aufrufen?

8

Ich suche nach dem besten Weg, um eine Methode aus einer anderen Komponente in cfscript dynamisch aufzurufen. Beachten Sie, dass es sich um eine Methode in einer anderen -Komponente handelt. Bisher habe ich 3 verschiedene Methoden ausprobiert, aber keine davon scheint genau das zu sein, wonach ich suche:

Alle Fälle werden in cfscript innerhalb einer Komponentenmethode geschrieben. Nehmen wir an, ich versuche, die setName(required string name) -Methode in der MyComponent -Komponente dynamisch aufzurufen. In allen Fällen sind folgende Variablen definiert:

%Vor%
  • Verwenden Sie evaluate() für den Job

    %Vor%

    Profis : ist mit sehr wenig Code gemacht worden Nachteile : Code ist nicht sehr "sauber" und die Verwendung von evaluate () scheint ein "Böses" zu haben Ruf in der Online-Community. Ich möchte nicht, dass mein Code böse ist.

  • Verwenden Sie einen cfml-Wrapper für <cfinvoke>

    %Vor%

    pros : Ich kann alle Funktionen von cfinvoke
    Nachteile verwenden : Erzeugt eine neue Instanz von MyComponent mit jedem Aufruf.

  • Erstellen Sie eine dynamicMethod -Methode in MyComponent

    %Vor%

    dynamicMethod von MyComponent:

    %Vor%

    Profis : Endlich kann ich myComp direkt aufrufen. Die bisher bequemste Lösung.
    Nachteile : Ich kann jetzt private Methoden von MyComponent über dynamicMethod aufrufen.
    (Ich habe auch die Funktion 'Funktion als Variable' außerhalb von MyComponent versucht, aber dann verliert die Funktion ihren Arbeitskontext. Wenn MyComponent beispielsweise eine Komponente erweitern würde, würde der 'Super'-Bereich nicht mehr auf die erweiterte Komponente verweisen.) / p>

Keine dieser Lösungen scheint perfekt zu sein, gibt es also keine andere Möglichkeit, eine dynamische Funktion von einem anderen Controller aus aufzurufen? Und wenn nicht, welche davon ist die beste Lösung?

Jeder Rat ist willkommen, danke.

    
jan 24.10.2012, 09:36
quelle

1 Antwort

7

Gute Analyse.

Eine Sache, die Sie hier tun könnten, ist, <cfinvoke> mit Ihrer Wrapper-Funktion näher zu emulieren. <cfinvoke> wird entweder einen Komponentenpfad oder eine Komponenteninstanz (dh ein Objekt) in diesem COMPONENT -Attribut verwenden. Also dein 'con' von 'Es erstellt eine neue Instanz von MyComponent mit jedem Aufruf.' ist nicht wirklich gültig.

ColdFusion 10 fügt übrigens eine invoke() Funktion hinzu um genau dies zu erreichen. Ich bemerke, dass du auf CF9 bist, also ist das keine Hilfe für dich. Aber es ist vielleicht relevant für andere Leute, die in dieser Frage landen könnten.

    
Adam Cameron 24.10.2012, 10:17
quelle

Tags und Links