1

在 CF8 中,我有一个工作 cftree,每个节点(多个节点)都有一个 RSS 提要。问题是我目前没有使用绑定,这意味着加载页面时会读取所有提要,这需要很长时间。我想要做的是将 cftreeitem 绑定到 cfc 以便仅在用户选择父 cftreeitem 而不是在页面加载时读取提要。该页面未引发错误,但提要的所有子节点均未显示在父节点下。

cfm:
<cfform name="RSS_exercise">
<cftree name="Xfeeds" format="html" cache="no">
    <cftreeitem value="elite"  display="<div style='color:##4c4c4c'>ELITE FTS</div>" queryasroot="true" expand="no">
        <cftreeitem value="" bind="cfc:components.rssQ.getEliteRSS({cftreeitempath}, {cftreeitemvalue})">
</cftree>
</cfform>

cfc:
<cffunction name="getEliteRSS" access="remote" returntype="any" hint="gets EliteFTS RSS feed">
<cfargument name="itemPath" type="string" required="false"/>
<cfargument name="itemValue" type="string" required="false"/>
<cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
<cfset var feedArray = ArrayNew(1) />
<cfset var feed = StructNew() />
<cfset var i = 1 />
<cfoutput query="eliteRSS">
    <cfset feed.value = "" />
    <cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(publisheddate)#</div><br/>" />
    <cfset feed.href = "#rsslink#" />
    <cfset feed.target = "_blank" />
    <cfset feed.parent = "elite" />
    <cfset feed.queryAsRoot = "false" />
    <cfset feed.expand = "no" />
    <cfset feedArray[i] = Duplicate(feed) />
    <cfset var i = "i++" />
</cfoutput>
<cfreturn feedArray />
</cffunction>

非常感谢您的帮助。


进行了以下更改,现在获得了输出,但它是嵌套/循环的,我无法获得顶级父节点,因此它们并不都是平坦的。这样做的目的是为了让 1 个父级在检查之前不会加载提要。

cfm
<cfform name="RSS_exercise">
<cftree name="Xfeeds" format="html" cache="no">
    <cftreeitem bind="cfc:components.rssQ.getEliteRSS({cftreeitempath}, {cftreeitemvalue})">
</cftree>
</cfform>

cfc
<cffunction name="getEliteRSS" access="remote" returntype="array" output="no" hint="gets EliteFTS RSS feed">
<cfargument name="itemPath" type="string" required="false"/>
<cfargument name="itemValue" type="string" required="false"/>
<cfset var feedArray = ArrayNew(1) />
<cfset var feed = StructNew() />
<cfset var i = 1 />
<cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
    <cfloop query="eliteRSS">
        <cfset StructClear(feed) />
        <cfset feed.value = "1" />
        <cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(publisheddate)#</div><br/>" />
        <cfset feed.href = "#rsslink#" />
        <cfset feed.target = "_blank" />
        <cfset feed.parent = "elite" />
        <cfset feed.queryAsRoot = "false" />
        <cfset feed.expand = "no" />
        <cfset feedArray[i] = Duplicate(feed) />
        <cfset i++ />
    </cfloop>           
    <cfreturn feedArray />
</cffunction>
4

2 回答 2

1

首先,您必须检查两件事:

  1. 确保返回 JSON 编码的数组(参见手册)。
  2. 在您的 Firefox 中安装 Firebug 并使用控制台选项卡跟踪确切的请求和响应。

在 CFC 中,您应该使用提供的参数来过滤提要中的数据。可能是获取数据的一种 QoQ。

还有一些关于您的服务器端代码的注释。

您不必在任何地方都使用 #,但您应该使用显式范围:

<cfset feed.href = "#rsslink#" />
<cfset feed.href = eliteRSS.rsslink />

您不必复制结构并跟踪索引。这可以简单得多:

<cfloop query="eliteRSS">
    <cfset feed = {} />
    ...
    <cfset ArrayAppend(feedArray, feed) />
</cfloop>  
于 2010-01-02T11:32:02.033 回答
1

我的第一个问题是没有对提要中的所有项目使用 leafnode=true 属性。然后我的下一个最大问题是没有正确设置arguments.value所以发生的事情是每次选择一个节点时它都会触发cfc,这只是重复cffeed,再次。这是我希望的 cfc 代码:

<cffunction name="getEliteRSS" access="remote" returntype="array" output="no" hint="gets EliteFTS RSS feed">
    <cfargument name="path" required="true"/>
    <cfargument name="value" required="true"/>
    <cfset var feedArray = ArrayNew(1) />
    <cfset var feed = StructNew() />

    <cfif arguments.value IS "">
        <cfset feed.value = "elite" />
        <cfset feed.display = "<div style='color:##4c4c4c'>ELITE FTS</div>" />
        <cfset feed.leafnode = "false" />
        <cfset feed.expand = "no" />
        <cfset ArrayAppend(feedArray, feed) />
    <cfelse>
        <cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
        <cfloop query="eliteRSS">
            <cfset feed = {} />
            <cfset feed.value = "" />
            <cfset feed.leafnode = "true" />
            <cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(eliteRSS.publisheddate)#</div><br/>" />
            <cfset feed.href = "#rsslink#" />
            <cfset feed.target = "_blank" />
            <cfset feed.parent = "elite" />
            <cfset feed.queryAsRoot = "false" />
            <cfset ArrayAppend(feedArray, feed) />
        </cfloop>           
    </cfif>
    <cfreturn feedArray />
</cffunction>
于 2010-01-02T16:01:02.543 回答