2009-06-23 10 views
6

Yahoo DataTable에 대해 here을 사용하고 있습니다.YUI DataGrid에서 데이터 소스를 변경 한 후 데이터 소스를 변경하는 방법

그리드를 한 번 렌더링하면 데이터를 변경하는 데 어려움이 있습니다. jQuery를 사용하여 AJAX를 통해 데이터를 얻거나 클라이언트 측 데이터 아일랜드에서 데이터를 가져 와서이를 다시 그리드에 넣어야합니다.

DataTable API에는 setDataSource 메소드가없고 'dataSource.liveData'를 변경해도 그리드가 업데이트되지 않습니다.

// does not work 
dataTable.dataSource.liveData = [ {name:"cat"}, {name:"dog"}, {name:"mouse"}; 

내 코드를 기반으로하는 예는 basic LocalDataSource example입니다.

테이블을 완전히 다시 만들 필요없이 어떻게 데이터 소스를 업데이트 할 수 있습니까? 비동기 호출을하는 YUI 데이터 소스를 사용하고 싶지 않습니다. 나는 이것을 어떻게 '수동으로'할 수 있는지 알아야합니다.

+0

simon, 이것을 확인하십시오. 이게 효과 있니? –

+0

@keith 내 상사가 항상 내 우선 순위를 변경하고 있습니다. didnt는 아직 시험해 보게된다. 당신이 알려 드리겠습니다 –

답변

5

올바른 길을 가고 있었지만 데이터 소스에 데이터를 보내도록 지시하는 것을 잊어 버렸습니다. 당신이 LocalDataSource를 사용하여 데이터 소스에있는 것과 테이블의 데이터를 교체하려는 가정, livedata를 교체 한 후 당신은

dataTable.getDataSource().sendRequest(null, 
    {success: dataTable.onDataReturnInitializeTable}, 
    dataTable); 

는 또한 API 참조에서 DataTable의 다른 onDataReturnXXX 방법을 참조 할. 바꾸기 대신 새 데이터를 추가 할 수 있습니다.

+0

감사. 이것은 작동하지만, 페이지 매김을 설정하면 업데이트 후에 페이지 매김 섹션이 사라집니다. 위에서 언급 한 코드 조각을 페이지 매김이있는 데이터 테이블에서 실행 해 보았습니까? 다시 한번 감사드립니다! – Abe

0

테이블을 완전히 다시 만들 필요없이 어떻게 데이터 소스를 업데이트 할 수 있습니까?

"새로운"문장을 사용하지 않고 의미 하시겠습니까? 그렇다면 스스로 할 필요는 없지만 자주 유이를 사용합니다. 나는 당신이 모든 행을 삭제하는 데 사용할 수있는 deleteRows 메서드가 있다는 것을 알아 차리고, 테이블의 길이를 0으로하고 addRows를 사용하여 리터럴 배열과이 경우 인덱스 인 0을 사용합니다.

시도해 보셨습니까?

편집 :this example을 살펴보십시오. 당신이하고 싶은 일은 분명히 할 수 있습니다. 테이블은 setInterval 메소드를 사용하여 설정된 간격으로 로컬로 업데이트됩니다 (놀랍지 않게). setInterval의 기능을 살펴보면 데이터 소스의 인스턴스에서 makeConnection이 호출됨을 알 수 있습니다. 이 메소드는 원격 호출을하는 것처럼 들리지만 꼭 그렇지는 않습니다.

예제에서 몇 줄을 살펴 보겠습니다.

// Set up polling 
    var myCallback = { 
     success: myDataTable.onDataReturnInitializeTable, 
     failure: function() { 
      YAHOO.log("Polling failure", "error"); 
     }, 
     scope: myDataTable 
    } 
    myDataSource.setInterval(5000, null, myCallback) 

마지막 줄에 한 번 호출 할 수있다 (또는 당신이 필요로하는 수요에) 대신 간격이처럼 다시 작성하여 다음 onDataReturnInitializeTable 메소드를 호출

myDataSource.makeConnection(null, myCallBack) 

- 내가 당신을 생각 더 직접적인 것을 부를 수 있습니다.

어쨌든 예제를 따라 가면서 불필요한 부분을 제거하십시오. 궁극적으로 onDataReturnInitializeTable 메서드가 키처럼 보입니다.

희망이 있습니다.

+0

예 '새로운 YAHOO.datatable()'을하지 말아야한다는 것을 의미합니다. 행을 수동으로 추가 및 삭제하지 않았습니다. 방금 전체 테이블을 업데이트하는 방법이 있어야한다고 생각했습니다. YUI AJAX 호출이 반환되면 모든 행을 삭제하고 다시 추가 할 수 없습니다. 그건 미친 짓이야. –

+0

매우 유망 해 보인다. 그것을 확인할 것입니다. 그리고 예. 타이머를 사용하지 않고 즉시 실행할 수 있어야합니다. –

+0

이 작업을 수행 했습니까? –

3

인수 속성에서 getState()를 호출하면 페이지 매김을 유지할 수 있다고 덧붙였습니다. 사실

dataTable.getDataSource().sendRequest(null, 
    { 
     success: dataTable.onDataReturnInitializeTable, 
     argument: dataTable.getState()  
    } 
); 
+1

그 위대한 작품! 어떻게하는지 궁금 해서요. –

0

, 나는 그것이 일하러 가야했던 모두는 다음 두 줄의 코드 (그리고 광산은 OP는 다른 그래서 조금 아약스에서 반환)

dataTable.dataSource.liveData = eval(o.responseText); 
dataTable.load({}); 

때문에 ... datatable.load()의 내용을 읽는다면 모든 사람이 부르는 것이 좋습니다.