Drop down menu Coldfusion Coldbox-查询中的创建和缓存下拉选项

Drop down menu Coldfusion Coldbox-查询中的创建和缓存下拉选项,drop-down-menu,coldfusion,handler,coldbox,Drop Down Menu,Coldfusion,Handler,Coldbox,我正在寻找意见和其他想法,因为我所做的是有效的,但我想问它是否是最优的 我有一个站点,当调用索引处理程序时,它用数据库表中的特定查询填充请求集合,这样我就可以构建供用户选择的下拉列表 我正在查询两个模型,并将它们的结果放入各自的变量中,然后在视图中循环遍历它们以创建下拉列表 索引处理程序 function index(event, rc, prc){ event.paramValue("debug",0); rc.stages = getmodel("tms_proposal_

我正在寻找意见和其他想法,因为我所做的是有效的,但我想问它是否是最优的

我有一个站点,当调用索引处理程序时,它用数据库表中的特定查询填充请求集合,这样我就可以构建供用户选择的下拉列表

我正在查询两个模型,并将它们的结果放入各自的变量中,然后在视图中循环遍历它们以创建下拉列表

索引处理程序

function index(event, rc, prc){
    event.paramValue("debug",0);
    rc.stages  = getmodel("tms_proposal_stage").select();
    rc.plannedGiftTypes  = getmodel("tms_funding_type").select();
    event.setLayout('layout.bootstrap');
}
索引视图

  <div class="form-group">
    <label for="proposal_stage" class="control-label">Proposal Stage Code</label>
    <select id="proposal_stage" name="proposal_stage" class="form-control">
    <cfloop query="rc.stages">
        <option value="#stage_code#">#short_desc#</option>
    </cfloop>

    </select>
  </div>
我知道两个查询并没有那么昂贵,但如果我需要运行其中的100个查询,则会出现可伸缩性问题。这些查询结果集变化不大,所以我在想,这些结果集是否应该以不同的方式缓存、存储和访问

我考虑过html5本地存储,我已经使用过,但没有在这方面使用过。 我还考虑创建一个新的处理函数,该函数进行所有这些数据库调用,并被缓存,然后被其他函数引用


无论如何,所有的想法都是值得欣赏的

你有几种选择。因为您使用的是ColdBox,所以您可以随时使用CacheBox。

对数据进行内联缓存的一种非常简单的方法是在组件顶部插入CacheBox提供程序:

component {
  property name="cache" inject="cachebox:default";
}
然后在事件中使用缓存API来存储和检索数据。我最喜欢的方法是getOrSet,因为它将它封装在一个调用中

rc.stages = cache.getOrSet(
  objectKey="stages",
  produce=function(){ 
    return getmodel("tms_proposal_stage").select();
  }
);
只有当密钥不在缓存中时,才会执行闭包。

另一种方法是缓存完整的HTML。为此,创建一个viewlet,该viewlet只输出表单控件的HTML。创建一个只返回该视图输出的事件,如下所示:

function stagesFormInput(event, rc, prc) cache=true {
  var stagesData = getmodel("tms_proposal_stage").select();
  return renderView(view="viewlets/stages", args={ stagesData : stagesData } );
}
注意,我将stageData直接传递到视图中,这样它就不会污染rc或prc。此数据将作为args.stagesData在viewlet中提供

还要注意方法声明中的cache=true。这就是让ColdBox在CacheBox的模板提供程序中缓存此事件的神奇之处。您可以指定超时,但这将使用默认值。现在,在/config/ColdBox.cfc文件中启用了eventCaching

最后,在主视图或布局中,只要在希望输出缓存HTML的任何地方运行新的viewlet

#runEvent("viewlets.stagesFormInput")#
这是一个稍微多一点的设置,但更强大,因为它缓存了完整的HTML片段,这是非常理想的。我还有一个完整的示例应用程序,可以在一个工作应用程序中演示这一点。您可以在这里查看:

为数据库调用提供一个单独的函数是有意义的。缓存不起作用。没有太大变化的查询结果仍然会发生变化,缓存会阻止这些变化的可用性。
#runEvent("viewlets.stagesFormInput")#