2013-07-15 1 views
2

익명 함수 내에서 AJAX 호출을하고 있습니다. 성공 콜백이 발생하면 데이터 서버에서 도착한 사용자 정의 JS 객체 ID 및 기타 중요한 정보를 설정할 수 있습니다.익명 함수로 인해 AJAX 성공 후 ID가 설정되지 않습니다.

반환 된 data.id에 a.target.id를 설정하면 모든 것이 잘 보입니다.

새로 업데이트 된 사용자 정의 JS 객체에 대한 작업을 수행하는 함수를 호출하는 단계에서 방금 서버의 응답 데이터로 업데이트했습니다. 그 객체의 부모에게 객체의 모든 자식에 대한 작업을 수행하는 메소드에 전달하고 있습니다.

그러나 스냅 샷 사진의 마지막 예에서 알 수 있듯이 a.target.parent.children [0] .id는 컬렉션에 없거나 설정되지 않은 ID입니다.

익명 함수를 사용할 때 AJAX 호출 중에 해당 개체에 대한 참조를 잃어 버려야합니다.

다음은 모두 코드입니다. 참조를 잃는 방법은 무엇입니까? 또는 AJAX 호출이 반환 될 때 그 부모의 자식에 대한 참조를 어떻게 유지할 수 있습니까?

이전에는 이런 일이 없었습니다. 익명 기능과 관련이 있다고 생각합니다.

var horizontalPositioner = function (horizontals) { 

    var hpa = ['?horPositions=']; 

    for (var i = 0; i < horizontals.children.length; i += 1) { 

     hpa.push(horizontals.children[i].id + ':' + horizontals.children[i].position + ','); 
    }; 

    hpa[i] = hpa[i].replace(',', ''); 

    dataBase.update(dbPart('horizontal' + hpa.join(''))); 
}; 


this.subscribe.call(this, e.horizontaladded, function (a, fn) { 
    // 
    if (!a.extra.owner.id) { 
     return; 
    }; 

    (function (a) { 

     dataBase.insert(
      dbPart(
      ['horizontal?a=', a.extra.owner.instanceName, '&id=', a.extra.owner.id].join(''), 
      a.target 
      ), 
      dbCB(
      function (data, status) { 
       if (status === 'error') { return; }; 

       a.target.id = data.id, 
       a.target.HTML().addClass('alum_' + data.id), 
       a.target.finish.id = data.finishID, 
       a.target.size.id = data.sizeID, 
       a.target.siteLine.id = data.sitelineID; 
       // 
       //reposition horizontals 
       // setTimeout(function() { horizontalPositioner(a.target.parent); }, 1000); 
       debugger 
       horizontalPositioner(a.target.parent); 

       if (fn) { processCallbacks(data, status, fn); }; 


       //very last 
       events.publishDatabaseCallbacks(e.horizontaladded, 
        eArgs(a.bay, { data: data, instanceName: 'horizontal', ownerid: a.extra.owner.id, id: data.id })); 

      }, 
      function (xhr, status, errorThrown) { console.log('ERROR adding horizontal'); }) 
     ); 

    }(a)); 

}, true); 

Snap shot of the three steps

+0

'a.target'을보고 있지 않습니까? – user2246674

답변

0

나는 모든을 구축 할 시간을 제공하기 위해 중첩에서는 setTimeout으로 익명 함수를 추가했습니다. 한 번에 많은 이벤트가 열리고 있기 때문에 지금은 작동합니다.

var horizontalPositioner = function (horizontals) { 

    (function (hors) { 

     setTimeout(function() { 

      var hpa = ['?horPositions=']; 

      for (var i = 0; i < hors.children.length; i += 1) { 
       hpa.push(hors.children[i].id + ':' + (hors.children[i].position ? hors.children[i].position : 1) + ','); 
      }; 

      hpa[i] = hpa[i].replace(',', ''); 

      dataBase.update(dbPart('horizontal' + hpa.join(''))); 

     }, 1000); 

    }(horizontals)); 
}; 
관련 문제