2013-10-16 3 views
0

그리드의 renderRow 이벤트 이후에 실행할 함수를 연결하려고합니다. 그래서 저는 DOJO의 aspect.after를 사용했습니다, 그러나 여기에 키커가 있습니다. 행이 실제로 렌더링되기 전에 실행되므로 divs \ tds가 아직 화면에 표시되지 않습니다. 그리고 아이템의 위치를 ​​사용하고자하므로 dojo/domgeometry을 사용하면 0으로 채워진 객체를 반환합니다. 행의 표시가 끝난 후 함수가 실행되도록 어떻게 보장 할 수 있습니까?dgrid 다음에 함수 실행 renderRow

JS 아래에서 JS를 찾을 수 있습니다.

aspect.after(grid, 'renderRow', function(row, args) { 
     var object = args[0]; 
     if (object.type == 'tipo_exec') { 
      row.className += ' black'; 
     } else if(object.type == 'exec') { 
      row.className += ' gray'; 
     } else if(object.type == 'ic') { 
      if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) { 
       require(['dojo/dom-geometry','dojo/dom-construct'], 
        function(domGeom, domConstruct){ 
         console.log(domGeom.position(row)); 
        } 
       ); 
      } 
     } 
     return row; 
    }); 

편집 : 또 한가지, 내가 나무 확장자를 사용하고, 부모에 대한 클릭이 확장 후 renderRow가 발생합니다.

편집 : 여기에 필요한 경우 더 많은 정보가 있습니다. 가게는 간단하지 :

store = new Observable(new Memory({'data': data, 
     'getChildren': function(parent, options){ 
      return this.query({'parent': parent.id}, options); 
     }, 
     'mayHaveChildren': function(parent){ 
      return parent.hasChildren; 
     } 
    })); 

그리고 그리드는 다음과 같이 선언한다 :

grid = new (declare([OnDemandGrid, Selection, Keyboard, CompoundColumns]))({ 
     'columns': nCols, 
     'query': { 'parent': undefined }, 
     'store': store 

    }, gridId); 

이가 호출되는

if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) { 
    console.log('just before adding the refresh'); 
     on.once(this, 'dgrid-refresh-complete', function(){ 
      console.log('finished refreshing'); 
      require(['dojo/dom-geometry','dojo/dom-construct'], 
       function(domGeom, domConstruct){ 
        console.log(domGeom.position(node)); 
       } 
      ); 
     }); 
} 

console.log('finished refreshing'); 결코 후 측면의 내부가, 어느 쪽도 않습니다 위치 로그.

그리드에는 많은 열이 있고, 비교 열에 연결된 몇 개의 열, 트리 인 이름 열 및 기타가 있습니다. 트리를 확장 할 때 renderRow가 호출됩니다!

Image of the grid with a couple of data removed

+0

은 매우 나쁜 생각을 @ahmed. –

+0

나쁜 생각은 무엇입니까? –

+0

이후 삭제 된 메모에 setTimeout이 제안되었습니다. –

답변

3

당신은 dgrid-refresh-complete 이벤트가 방출 될 때까지 domGeom.position(row)의 호출을 지연시킬 수 있습니다. dojo/on을 포함해야합니다.

aspect.after(grid, 'renderRow', function(row, args) { 
    var object = args[0]; 
    if (object.type == 'tipo_exec') { 
     row.className += ' black'; 
    } else if(object.type == 'exec') { 
     row.className += ' gray'; 
    } else if(object.type == 'ic') { 
     if ((typeof(object.dep)!='undefined') && (object.dep.length > 0)) { 
      on.once(this, 'dgrid-refresh-complete', function(){ 
       require(['dojo/dom-geometry','dojo/dom-construct'], 
        function(domGeom, domConstruct){ 
         console.log(domGeom.position(row)); 
        } 
       ); 
      }) 
     } 
    } 
    return row; 
}); 

편집 업데이트 jsfiddle 나무 수용 할 수 http://jsfiddle.net/rayotte/q8bCx/2/

+0

달콤한, 그것을 시도하고 여기에 결과를 게시 할 것입니다 –

+0

그것은 불행히도 작동하지 않습니다. 나는'dgrid-refresh-complete' 이벤트를 그리드와 grid.domNode (onDemandList.js에서 호출 됨)에 연결하려고 시도했지만 어느 옵션도 트리거되지 않습니다. 차이가 있다면, 이것은 그리드에 대한 선언입니다. 'declare ([OnDemandGrid, Selection, Keyboard, CompoundColumns]) –

+0

코드는 테스트되었으며 작동합니다. if ((typeof (object.dep)! = 'undefined') && (object.dep.length> 0))'조건의 하나가 충족되지 않았을 수 있습니다. –

관련 문제