标签 CFLOOP 的属性验证错误

Attribute validation error for tag CFLOOP

我对这种 coldfusion 语言很陌生,我做了一些教程,我只是按照课程告诉我的去做,但是我在这段代码上遇到错误,有人可以向我解释为什么吗?

<cfset carrinho=ArrayNew(1)>

<cfset carrinho[1]=StructNew()>
<cfset carrinho[1].nome="Camisa da Seleção Brasileira">
<cfset carrinho[1].valor=189>
<cfset carrinho[1].quantidade=1>

<cfset carrinho[2]=StructNew()>
<cfset carrinho[2].nome="Chuteira CR7">
<cfset carrinho[2].valor=470>
<cfset carrinho[2].quantidade=2>

<cfset carrinho[3]=StructNew()>
<cfset carrinho[3].nome="Short do Messi">
<cfset carrinho[3].valor=180>
<cfset carrinho[3].quantidade=1>

<cfdump var="#carrinho#">

<cfloop list="#carrinho#" item="name" index="i">
    <cfoutput>
        #i#:#name#
    </cfoutput>
</cfloop>

原因是carrinho是数组,不是列表。你可以用很多不同的方式循环它。

  1. 方法是使用array属性循环

    <cfset counter=1>
    <cfloop array="#carrinho#" index="item">
      <cfoutput>#counter#. #item.nome#</cfoutput>
      <cfset counter++>
    </cfloop>
    

    DEMO

  2. 使用索引循环 ArrayLen

    <cfloop from="1" to="#ArrayLen(carrinho)#" step="1" index="i">
      <cfoutput>#i#. #carrinho[i].nome#</cfoutput>
    </cfloop>
    

    DEMO

  3. 使用cfscriptfor循环

    <cfscript>
      counter=1;
      for(item in carrinho){
        writeoutput("#counter#. #item.nome#")
        counter++;
      }
    </cfscript>
    

    DEMO

这些只是一些实现方法。还有许多其他方法可以做到这一点。

以 RRK 的回答和 Ageax 的评论为基础: 这就是在 ColdFusion 脚本中构建数组(带有嵌套结构)是多么容易。

备注:

"//" = a comment

"[]" = an implicit array

"{}" = an implicit struct

<cfscript>

  // Build the array with structs.
  carrinho = [  
    {    
        nome : "Camisa da Seleção Brasileira" ,
        valor : 189 ,
        quantidade : 1
    } ,
    { 
        nome : "Chuteira CR7" ,
        valor : 470 ,
        quantidade : 2
    } ,
    { 
        nome : "hort do Messi" ,
        valor : 180 ,
        quantidade : 1
    }
  ] ;

  // Using the counter method to determine the number     
  counter=1 ;
  for(item in carrinho) {
    writeoutput(counter & ". " & item.nome & "<br>") ; 
    counter++;
  }


  // Using each() member function
  carrinho.each(function(element, index) {
      writeOutput(index & ". " & element.nome & "<br>");

  });  

</cfscript>

DEMO

输出:

  1. Camisa da Seleção Brasileira
  2. Chuteira CR7
  3. hort do Messi

这是适合您的解决方案

<cfset carrinho=ArrayNew(1)>

<cfset carrinho[1]=StructNew()>
<cfset carrinho[1].nome="Camisa da Seleção Brasileira">
<cfset carrinho[1].valor=189>
<cfset carrinho[1].quantidade=1>

<cfset carrinho[2]=StructNew()>
<cfset carrinho[2].nome="Chuteira CR7">
<cfset carrinho[2].valor=470>
<cfset carrinho[2].quantidade=2>

<cfset carrinho[3]=StructNew()>
<cfset carrinho[3].nome="Short do Messi">
<cfset carrinho[3].valor=180>
<cfset carrinho[3].quantidade=1>

<cfdump var="#carrinho#">

<cfloop array="#carrinho#" index="i">
    <cfoutput>
        #i.nome#
    </cfoutput>
</cfloop>

你应该使用数组而不是列表。

这是一个 CF10 示例,循环出数组,然后使用内部循环来循环出表示数组每个索引的结构:

<cfoutput>

  <cfset carrinho=ArrayNew(1)>

  <cfset carrinho[1]=StructNew()>
  <cfset carrinho[1].nome="Camisa da Seleção Brasileira">
  <cfset carrinho[1].valor=189>
  <cfset carrinho[1].quantidade=1>

  <cfset carrinho[2]=StructNew()>
  <cfset carrinho[2].nome="Chuteira CR7">
  <cfset carrinho[2].valor=470>
  <cfset carrinho[2].quantidade=2>

  <cfset carrinho[3]=StructNew()>
  <cfset carrinho[3].nome="Short do Messi">
  <cfset carrinho[3].valor=180>
  <cfset carrinho[3].quantidade=1>

  <cfloop array="#carrinho#" index="obj">
    <cfloop collection="#obj#" item="key">
      #key#: #obj[key]#<br />
    </cfloop>
    <br />
  </cfloop>

</cfoutput>