2009-11-04 2 views
0

동적으로 생성 된 탐색 '노드'를 클릭하면 변수의 현재 값을 전달하려고합니다. 이것은 정수가 될 필요가 있지만 마지막 노드의 값을 반환합니다. 값을 전달하기 위해 여러 가지 메서드를 시도했습니다. 사용자 지정 이벤트 수신기, 설정자,하지만 클로저에 문제가 있다고 생각합니다. 도움을 받으실 수 있습니다. ;-) 난 당신의 코드를 읽으려고하지 않을거야폐쇄 문제입니까? - 변수의 현재 값 전달

function callGrid():void { 

    for (var i:Number = 0; i < my_total; i++) { 

     var gridnode_url = my_grid[i][email protected]; 
     var news_category= my_grid[i][email protected]; 
     var newstitle = my_grid[i][email protected]; 
     var news_content = my_grid[i]..news_content; 
     var news_image = my_grid[i]..news_image; 

     var gridnode_loader = new Loader(); 
     container_mc.addChild(gridnode_loader); 
     container_mc.mouseChildren = false; 
     gridnode_loader.load(new URLRequest(gridnode_url)); 
     gridnode_loader.contentLoaderInfo.addEventListener(Event.COMPLETE, gridLoaded); 
     gridnode_loader.name = i; 

     text_container_mc = new MovieClip(); 
     text_container_mc.x = 0; 
     text_container_mc.mouseEnabled = false; 
     var textY = text_container_mc.y = (my_gridnode_height+18)*y_counter; 
     addChild(text_container_mc); 
     var tf:TextSplash=new TextSplash(newstitle,10,0,4); 
     container_mc.addChild(tf); 
     tf.mouseEnabled = false; 
     tf.height = my_gridnode_height; 
     text_container_mc.addChild(tf); 
     var text_container_mc_tween = new Tween(text_container_mc, "alpha", Strong.easeIn, 0,1,0.1, true); 

     gridnode_loader.x = (my_gridnode_width+5) * x_counter; 
     gridnode_loader.y = (my_gridnode_height+15) * y_counter; 

     if (x_counter+1 < columns) { 
      x_counter++; 
     } else { 
      x_counter = 0; 
      y_counter++; 
     } 
    } 
} 
function gridLoaded(e:Event):void { 
    var i:uint; 
    var my_gridnode:Loader = Loader(e.target.loader); 
    container_mc.addChild(my_gridnode); 
    _xmlnewstarget = my_gridnode.name; 

//|||||||||||||||||||||||||||||||||||||||| 
//when a particular grid node is clicked I need to send the current _xmlnewstarget value to the LoadNewsContent function... 
//||||||||||||| |||||||||||||||||||||||| 

    my_tweens[Number(my_gridnode.name)]=new Tween(my_gridnode, "alpha", Strong.easeIn, 0,1,0.1, true); 
    my_gridnode.contentLoaderInfo.removeEventListener(Event.COMPLETE, gridLoaded); 
    my_gridnode.addEventListener(MouseEvent.CLICK, loadNewsContent); 

} 

function loadNewsContent(e:MouseEvent):void { 
    createNewsContainer(); 
    getXMLNewsTarget(); 
    news_category = my_grid[_xmlnewstarget][email protected]; 
    var tfnews_category:TextSplash=new TextSplash(news_category,20,16,32,false,false,0xffffff); 
    tfnews_category.mouseEnabled = false; 

    newstitle = my_grid[_xmlnewstarget][email protected]; 
    var tftitle:TextSplash=new TextSplash(newstitle,20,70,24,false,false,0x333333); 
    news_container_mc.addChild(tftitle); 
    tftitle.mouseEnabled = false; 

    news_content = my_grid[_xmlnewstarget]..news_content; 
    var tfnews_content:TextSplash=new TextSplash(news_content,20,110,20,true,true,0x333333,330); 
    news_container_mc.addChild(tfnews_content); 
    tfnews_content.mouseEnabled = false; 
    news_image = my_grid[_xmlnewstarget][email protected]_image; 
    loadNewsImage(); 
    addChild(tfnews_category); 
    addChild(tftitle); 
    addChild(tfnews_content); 

    var news_container_mc_tween = new Tween(news_container_mc, "alpha", Strong.easeIn, 0,1,0.3, true); 
    news_container_mc_tween.addEventListener(Event.INIT, newsContentLoaded); 
} 

답변

5

(그냥 들여 쓰기있어 경우에도 포맷 작업을하려고),하지만 난 간단한 예를 제공합니다 :

for (var i = 0; i < my_total; i++) { 
    var closure = function() { 
     // use i here 
    } 
} 

여러분이 말한대로 closure을 호출하면이 값은 i (이 경우 my_total)이됩니다. 대신이 작업을 수행합니다 :

for (var i = 0; i < my_total; i++) { 
    (function(i) { 
     var closure = function() { 
      // use i here 
     } 
    })(i); 
} 

이것은 당신의 폐쇄가 그 값을 참조 할 수 있도록 i의 현재 값을 "캡처"루프 안에 다른 기능을 만듭니다.

더 많은 유사한 예를 보려면 How does the (function() {})() construct work and why do people use it?을 참조하십시오.

+0

요약 :) * 변수가 아닌 Scopes *는 자바 스크립트에서 "폐쇄"되어 새로운 함수 선언 만 새로운 범위를 만들 수 있습니다. –

+0

Greg에게 클로저 기능을 제공해 주셔서 감사합니다. 코드를 추가하고 형식 변환이 올바른지 확인한 다음 _xmlnewstarget 변수에 대한 설정자를 추가했습니다. 나는 완벽한 룰렛 바퀴를 만들었습니다! 값은 24130, 01432, 04312, 02143, 02143, 14302, 02143, 21403, 43021, 24310, 02143, 14302, 02143, 43021의 5 노드에 대해 변경됩니다. 마지막 값은 _xmlnewstarget ... – martin

+0

의 값입니다. 결국 다른 경로로 정렬 할 수있었습니다. 각 뉴스 항목의 xml에 뉴스 ID를 추가하고이를 텍스트 컨테이너에 참조했습니다. - text_container_mc.id = my_grid [i]. @ id; 그런 다음 text_container_mc.addEventListener (mouseEvent.CLICK, loadNewsContent)를 사용하여 loadNewsContent로 바로 넘어갔습니다. 그 함수에서 e.target.id를 사용하여 텍스트 필드를 연결했습니다. - newstitle = my_grid [e.target.id]. @ newstitle; 이제 역 탐색을 정렬해야합니다.하지만이 문제는 정렬되어 있다고 생각합니다 .-) 감사합니다. – martin

0

음, 위에서 언급 한 것처럼 코드가 조금 촘촘하지만 문자열과 정수 사이에 형식 변환 문제가 조금있을 수 있다고 생각합니다. "마지막 값"은 항상 0입니까? 이러한 변화를 시도하고 당신이 어떻게 일어나는지 알려주십시오.

아, 나는이 코드 블록을 일단 리팩터링해야한다고 말할 필요도없이 생각합니다.

편집 : 추가 연구 후에 나는 당신이 당신의 loadNewsContent는 첫째 (id:String)

+0

코드 레이아웃에 대해 사과드립니다. 최대한 빨리 제안을 드리겠습니다. – martin

0

(e:MouseEvent)에서 가지 인자를 변경이

//replace this: my_gridnode.addEventListener(MouseEvent.CLICK, loadNewsContent); 

var anonHandler:Function = function(e:MouseEvent):void 
{ 
    loadNewsContent(_xmlnewstarget); 

}; 
my_gridnode.addEventListener(MouseEvent.CLICK, anonHandler); 

필요하다고 생각, 당신은 (두 번 같은 로더로 addChild 호출 할 필요는 없다 한 번 callGrid에서) 그리고 나서 (gridLoaded). 그렇다면news_category = my_grid[int(e.target.name)][email protected];
대신
news_category = my_grid[_xmlnewstarget][email protected];
을 넣을 수 있습니다. _xmlnewstarget은 더 큰 범위로 보이므로로드 작업이 완료 될 때마다 업데이트됩니다.

+0

감사 드리며, 가능한 한 빨리 테스트하겠습니다. – martin