2011-05-10 5 views
1

이 코드를 고려하십시오 최초의 "이"참조를 유지 :중첩 jQuery의으로 .Append() .each(), 추가()와

  var ul = $(".list_b").find("li").remove().end(); 
     $.each(Sites, function (index, value) { 
      ul.append(
       $("<li></li>") 
        .append(
         $("<span></span>") 
          .addClass("img_b") 
          .css("background-image", "url(pin.png)") 
          .text(value.Name) 
        ) 
        .append(
         $("<div></div>") 
          .addClass("div_archives") 
          .each(value.Documents, function (index2, value2) { 
           this.append(
            $("<a></a>") 
             .attr({ href: value.URL }) 
             .attr({ target: "_blank" }) 
             .html(value2.Name) 
             .append(
              $("<img />") 
               .attr({ src: "../img/icon_" + value2.Type + ".png" }) 
               .attr({ alt: "Archive " + value2.Tipo }) 
             ) 
           ) 
          } 
          ) 
        ) 
      ); 
     }); 

그리고 소스 객체로이 JSON을.

[ { 
    "Id":1, 
    "Name":"Rachel Weiss", 
    "Color":"FF0000", 
    "Symbol":"A", 
    "Latitude":51.123123, 
    "Longitude":12.131231, 
    "Documents":[ 
    { 
     "Id":1, 
     "Name":"Document 1", 
     "Ext":"pdf", 
     "Type":"pdf", 
     "URL":"http://www.google.com" 
    }, 
    { 
     "Id":2, 
     "Name":"Document 2", 
     "Ext":"doc", 
     "Type":"word", 
     "URL":"http://www.yahoo.com" 
    }, 
    { 
     "Id":3, 
     "Name":"Document 3", 
     "Ext":"xls", 
     "Type":"excel", 
     "URL":"http://www.amazon.com" 
    } 
    ], 
    "Notes":[ 
    { 
     "Id":0, 
     "Texto":"test test" 
    }, 
    { 
     "Id":1, 
     "Texto":"test test. test test" 
    } 
    ]},{ 
    "Id":2, 
    "Name":"Natalie Portman", 
    "Color":"00FF00", 
    "Symbol":"B", 
    "Latitude":51.123123, 
    "Longitude":12.131231, 
    "Documents":[ 
    { 
     "Id":11, 
     "Name":"Document 11", 
     "Ext":"doc", 
     "Type":"word", 
     "URL":"http://www.google.com" 
    } 
    ], 
    "Notes":[ 
    { 
     "Id":10, 
     "Texto":"test test. test test. test test." 
    } 
    ]} ... ] 

내가 달성하기 위해 노력 해요 목표는 부모 <div></div> 블록으로 <a></a> 블록을 추가하는 것입니다,하지만 난 외부 "이"개체를 참조 할 수있는 방법을 찾을 수 없습니다.

나는 이것이 절름발이 질문이어야 함을 알고 있지만 모든 아이디어가 매우 환영받을 수 있도록 단서가 없습니다.

미리 감사드립니다.


이 추가적으로 정보 : 어느 this$(this) 작품, 두 가지 당신이 필요로 내부

+0

jQuery가 최대한 익숙했습니다. – BoltClock

+2

템플릿 엔진을 사용 해본 적이 있습니까? 나는 jQuery Templates를 추천합니다 : http://api.jquery.com/category/plugins/templates/ –

+3

@BoltClock : Rachel Weiss와 Natalie Portman이 특징입니다! –

답변

1

문제의 근본 원인은 사용자가 each 기능을 악용하는 것으로 보입니다. 두 가지 맛이 있습니다. 하나는 일치하는 요소 세트를 반복하는 데, 다른 하나는 배열과 같은 것을 반복하는 데 사용됩니다 (I 'll this "utility"flavor).

당신의 용도에 따라 <div> 요소를 하이재킹하여 유틸리티 풍미에 사용하는 것입니다. $.each을 호출하는 것과 같습니다. 여기서 this은 반복 값을 나타냅니다.

난 당신의 문제에 대한 적절한 해결책은 전체 구조를 다시 생각하고 함수 호출의 한 거대한 체인에서 모든 것을하려고하지 않을 것이라고 생각합니다.

아니면 jQuery Templates와 같은 템플릿 엔진을 사용하십시오.

+0

이봐,이 코멘트는 내가 2 일 동안 전체 앱을 다시 작성하기 위해 늦게까지 일하게 만들었지 만 추가 작업은 모든 라인에 가치가 있었다. 이제 페이지 렌더링은 완전히 템플릿을 기반으로합니다. 유지 보수는이 접근법으로 훨씬 더 효율적입니다. 고마워, 너 내 주를 만들었 어! :-) – Rodrigo

+0

@Rodrigo, 나는 그것을 듣게되어 기쁩니다 :) –

3

, 당신은 변수에 할당 (개체가이 속성 또는 메서드를 지원하지 않습니다) 런타임 예외가 발생합니다, 그래서 ... 후 사용할 수 있습니다

당신이 그런 식으로, 당신은 그래서

$("myelement").click(function() { 
     var elementtoneed = this; 
     $("myotherelement").load('sample.html', function() { 
      $(elementtoneed).hide(); 
     }); 
}); 

이 있다고 나중에 참조 할 수 있도록 "this"요소를 저장합니다.

+0

이 일반적인 해결책은 OP가 달성하고자하는 것에 실제로 적용되지 않습니다. –

+0

좋은 생각, 사실 나는이 aproach에서 전에 생각하지 않기 때문에 어리 석다. 이제 문제는 체인 내부의 변수를 캡처하는 것입니다. 누군가는'($ temp_div = $ ("

"))'을 제안했으나 성공하지 못했습니다. – Rodrigo

+0

그 코드가 거의 읽을 수 없다는 진실은 ... @Rodrigo 나누기 : 정복 : –