Coldfusion Coldbox - 从查询中创建和缓存下拉选项
Coldfusion Coldbox - create and cache drop down options from queries
我正在寻找意见和替代想法,因为我正在做的是工作,但想问问它是否是最优的
我有一个站点,当索引处理程序被调用时,它会使用数据库表中的特定查询填充请求集合,以便我可以为用户构建下拉菜单 select。
我正在查询两个模型并将它们的结果放入各自的变量中,然后在视图中循环遍历它们以创建下拉列表
索引处理程序
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。
https://github.com/ColdBox/cbox-refcards/raw/master/CacheBox/CacheBox-Refcard.pdf
一种非常简单的数据内联缓存方法是在组件顶部注入一个 CacheBox 提供程序:
component {
property name="cache" inject="cachebox:default";
}
然后在您的事件中使用缓存 API 来存储和检索数据。我最喜欢的方法是 getOrSet(),因为它将它包装在一次调用中。
rc.stages = cache.getOrSet(
objectKey="stages",
produce=function(){
return getmodel("tms_proposal_stage").select();
}
);
仅当密钥不在缓存中时才执行闭包。
http://wiki.coldbox.org/wiki/WhatsNew:CacheBox-1.6.cfm#Get_Or_Set_Baby
另一种方法是缓存完整的HTML。为此,创建一个只为表单控件输出 HTML 的视图。创建一个事件,该事件 returns 只是该视图的输出,如下所示:
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”提供。
还要注意方法声明中的“cache=true”。这就是告诉 ColdBox 缓存此事件的魔法(在 CacheBox 的 "template" 提供程序内)。您可以指定超时,但这将使用默认值。现在,在您的 [=46 中启用 eventCaching =].cfc 文件.
coldbox={
eventCaching = true
}
http://wiki.coldbox.org/wiki/ConfigurationCFC.cfm#Application_Aspects
最后,在您的主视图或布局中,只需 运行 您希望输出缓存 HTML 的任何地方的新视图。
#runEvent("viewlets.stagesFormInput")#
这个设置有点多,但更强大,因为它缓存了完整的 HTML 片段,这非常理想。我还有一个完整的示例应用程序,可在工作应用程序中对此进行演示。你可以在这里查看:
https://github.com/bdw429s/ColdBox-Viewlet-Sample
我正在寻找意见和替代想法,因为我正在做的是工作,但想问问它是否是最优的
我有一个站点,当索引处理程序被调用时,它会使用数据库表中的特定查询填充请求集合,以便我可以为用户构建下拉菜单 select。
我正在查询两个模型并将它们的结果放入各自的变量中,然后在视图中循环遍历它们以创建下拉列表
索引处理程序
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。 https://github.com/ColdBox/cbox-refcards/raw/master/CacheBox/CacheBox-Refcard.pdf
一种非常简单的数据内联缓存方法是在组件顶部注入一个 CacheBox 提供程序:
component {
property name="cache" inject="cachebox:default";
}
然后在您的事件中使用缓存 API 来存储和检索数据。我最喜欢的方法是 getOrSet(),因为它将它包装在一次调用中。
rc.stages = cache.getOrSet(
objectKey="stages",
produce=function(){
return getmodel("tms_proposal_stage").select();
}
);
仅当密钥不在缓存中时才执行闭包。 http://wiki.coldbox.org/wiki/WhatsNew:CacheBox-1.6.cfm#Get_Or_Set_Baby
另一种方法是缓存完整的HTML。为此,创建一个只为表单控件输出 HTML 的视图。创建一个事件,该事件 returns 只是该视图的输出,如下所示:
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”提供。
还要注意方法声明中的“cache=true”。这就是告诉 ColdBox 缓存此事件的魔法(在 CacheBox 的 "template" 提供程序内)。您可以指定超时,但这将使用默认值。现在,在您的 [=46 中启用 eventCaching =].cfc 文件.
coldbox={
eventCaching = true
}
http://wiki.coldbox.org/wiki/ConfigurationCFC.cfm#Application_Aspects
最后,在您的主视图或布局中,只需 运行 您希望输出缓存 HTML 的任何地方的新视图。
#runEvent("viewlets.stagesFormInput")#
这个设置有点多,但更强大,因为它缓存了完整的 HTML 片段,这非常理想。我还有一个完整的示例应用程序,可在工作应用程序中对此进行演示。你可以在这里查看: https://github.com/bdw429s/ColdBox-Viewlet-Sample