gpt4 book ai didi

coldfusion - 如何使用 cfscript 从不同的组件动态调用方法?

转载 作者:行者123 更新时间:2023-12-04 07:56:26 24 4
gpt4 key购买 nike

我正在寻找从 cfscript 中的不同组件动态调用方法的最佳方法。请注意,它与 中的方法有关。不同零件。到目前为止,我已经尝试了 3 种不同的方法,但它们似乎都不是我想要的:

所有的案例都写在一个组件方法中的cfscript中。假设我正在尝试动态调用 setName(required string name) MyComponent 组件中的方法。所有案例都定义了以下变量:

var myComp = new MyComponent();
var myMethod = "setName";
var args = {"name"="foo"};
  • 使用 evaluate()为了工作
    evaluate("myComp.#myMethod#(argumentCollection=args)");

    专业人士 : 用很少的代码完成
    缺点 :代码不是很“干净”,并且evaluate() 的使用似乎在在线社区中享有“邪恶”的名声。我不希望我的代码是邪恶的。
  • <cfinvoke> 使用 cfml 包装器
    invoke("MyComponent", myMethod, args);

    专业人士 : 我可以使用 cfinvoke 的所有功能
    缺点 : 它创建一个 MyComponent 的新实例每次调用。
  • 创建 dynamicMethod MyComponent 中的方法
    myComp.dynamicMethod(myMethod, args);

    MyComponent 的动态方法:
    public any function dynamicMethod(required string methodName, required struct argumentColl){  
    var cfcMethod = variables[arguments.methodName];
    return cfcMethod(argumentCollection=arguments.argumentColl);
    }

    专业人士 : 我终于可以直接调用myComp了。迄今为止最舒适的解决方案。
    缺点 : 我现在可以通过 dynamicMethod 调用 MyComponent 的私有(private)方法。
    (我也在 MyComponent 之外尝试了“作为变量的函数”解决方案,但随后该函数失去了其工作上下文。例如,如果 MyComponent 将扩展一个组件,则“ super ”范围将不再引用扩展的组件)。

  • 这些解决方案似乎都不是完美的,所以没有其他方法可以从不同的 Controller 调用动态函数吗?
    如果没有,其中哪一个是最好的解决方案?

    欢迎任何建议,谢谢。

    最佳答案

    好分析。

    您可以在这里做的一件事是更接近地模拟 <cfinvoke>使用您的包装器功能。 <cfinvoke>将在 COMPONENT 中采用组件路径或组件实例(即:对象)属性。所以你的“骗局”是“每次调用都会创建一个 MyComponent 的新实例”。不是真的有效。

    顺便说一句,ColdFusion 10 添加了 invoke() 功能来实现这一点。我注意到你在 CF9 上,所以这对你没有帮助。但这可能与可能涉及此问题的其他人有关。

    关于coldfusion - 如何使用 cfscript 从不同的组件动态调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046520/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com