2011-08-18 9 views
1

나는 세션에 저장된 쇼핑 카트 배열을 가지고있다.의 ColdFusion 배열 및 구조체

양식 게시를 통해 배열 색인을 arrayDeleteAt으로 보내겠습니다.

이제 하단 3 개 항목을 선택하면 삭제되지 않습니다. 여기

내 삭제 코드입니다.

<cfif isDefined("form.leadId") AND listLen(form.leadId)> 
    <cfloop from="#listLen(form.leadId)#" to="1" step="-1" index="i"> 
    <cfset temp = arrayDeleteAt(session.shoppingcart, #i#)> 
    </cfloop> 
</cfif> 
+2

당신이 결과를 사용하지 않기 때문에,뿐만 아니라'temp'을 제거 할 수 있습니다. 즉, ' – Leigh

+1

Leigh는 해시 기호가 필요 없기 때문에 해시 기호도 제거했습니다 ... ColdFusion은 이미 그것들없이'i'를 평가할 것입니다. –

답변

7

이 장바구니를 관리하는 방법에 더 많은 문제가 있습니다. ArrayDeleteAt를 사용하면 배열의 인덱스가 다시 계산되므로 배열에서 잘못된 항목을 삭제할 가능성이 높거나 범위를 벗어난 항목을 삭제하려고하면 오류가 발생할 수 있습니다.

목록을 거꾸로 작업하여이 문제를 해결하려고 노력하고 있으며 Dan이 위의 코드를 사용하여 문제가 발생한 것이 맞지만 목록이 잘못된 순서로 전달 된 경우 상처의 세계.

대신 배열을 사용하는 대신 UUID와 같은 대리 키가있는 구조체를 사용하고 그 키로 항목을 삭제할 것을 제안합니다.

CF 10 라일로 4에서
5
문제는 당신이 전달되고있는 양식 필드를 카운터의 위치에서 삭제하고,하지 않을 것입니다

대신을 시도해보십시오

<cfset temp = arrayDeleteAt(session.shoppingcart, ListGetAt(FORM.leadID, i) /> 

업데이트 : 타일러가 언급 한 문제를 해결하기 위해 및 ArraySort을 사용하여 FORM.leadID에서 배열로 색인을 변환하여 삭제 순서가 올바른지 확인하십시오.

내 대답은 즉각적인 문제를 해결하는 반면, 타일러의 조언을 따르고 장바구니의 각 항목에 대한 키를 사용하여 내가 실제로 생각한다고 생각하는 것을 관리하고 있는지 확인하는 것이 좋습니다. 관리 :

0

이를 사용하여 수행 할 수있는 Underscore.cfc librarymost recent version :

<cfscript> 
if (structKeyExists(form, 'leadId') && listlen(form.leadId)) { 
    _ = new Underscore(); 

    variables.shoppingCart = duplicate(session.shoppingCart); 

    variables.newCart = _.reject(variables.shoppingCart, function(val, index){ 
     return _.include(form.leadId, index); 
    }); 
} 
</cfscript> 

<cfif structKeyExists(variables, "newCart") > 
    <cflock scope="session" type="exclusive" timeout="10"> 
     <cfset session.shoppingCart = variables.newCart> 
    </cflock> 
</cfif> 

당신은 내가 그것을 편집, 변수 범위에 쇼핑 카트를 복사하고있어 것을 볼 수 있습니다, 다음 필요하다면 다시 자물쇠로 복사하십시오. cfscript에 cflocks를 작성할 수 있다면 cfscript에서이 모든 작업을 수행했습니다.

(면책 조항 : 나는 Underscore.cfc을 썼다)