2014-06-15 2 views
1

이것은 순수한 자바 스크립트의 질문 일 수 있지만 어떻게 든이 권리를 얻을 수 없습니다. 나는 extachs4.2에서 sencha 아키텍트를 사용하고있다. 나는 단지 "ExamName"의 데이터를 사용하여 그리드를 다시 구성입니다 무엇을 찾고배열의 상점에있는 필드의 데이터를 반환합니다.

{ 
    "data": [{ 
     "ExamID": 1, 
     "ExamName": "Semester-1", 
     "MaxMarks": 100 
    }, { 
     "ExamID": 4, 
     "ExamName": "Test-1", 
     "MaxMarks": 10 
    }, { 
     "ExamID": 5, 
     "ExamName": "Test-2", 
     "MaxMarks": 10 
    }] 
} 

로 서버에서 전송 된 JSON 응답이있다. 따라서 "ExamName"은 reconfigure() 함수에서 배열로 전달됩니다.

"ExamName"을 배열 형식으로 가져올 수 없습니다. 당신의 도움이 매우

 var gridStore = Ext.data.StoreManager.get('ClassSemesterStore'); 

var g = gridStore.load({params : {ClassID: ClassData }}); 

var data = g.data; 

var length = data.getCount(); 

var examName = []; 
for(var i = 0; i < length; i++){ 
    examName.push(data[i]['ExamName']); 
} 

가 말한다 "catch되지 않은 형식 오류를 : 정의되지 않은 재산 'ExamName'읽을 수 없습니다"감사합니다

답변

0

스토어의 data하지 배열한다. 내가 생각하기에 혼합 컬렉션입니다. 그래서 다음 중 하나를 사용하십시오 :

var examName = []; 
for(var i = 0; i < length; i++){ 
    examName.push(data.items[i].data['ExamName']); 
} 

더 나은 아직 사람들이 제안한 것과 같은 소스에서 정보를 얻을.

또 다른 좋은 대안은 Store's collect입니다.

gridStore.collect('ExamName') 
+0

안녕하세요. adaskos 위 답변에 답변했습니다. 그러나 오류가 발생합니다 - 발췌문은 현재 레코드가 아니라 이전에 선택한 레코드의 배열을 제공합니다. 나는 또한 시도했다 Store.loadData ([], false); 을 다시로드하기 전에 저장소의 모든로드 된 데이터를 지우십시오. – user2677125

+0

그리드 저장소를 언제 어떻게 재구성합니까? 상점의 이전 인스턴스에 대한 참조가있을 수 있습니까? 더 많은 코드를 제공해야합니다. – adaskos

+0

서로 다른 저장소가 나란히 구성된 두 개의 그리드가 있습니다. 첫 번째 표에서 표 선택 수신기를 사용하고 있습니다. 그리드 행을 선택하면 'ClassID'가 표시됩니다. var Grid = this.getSemGrid(); var Store = Grid.getStore(); // 그리드의 저장소 var ClassData = record.get ('ClassID'); console.log (ClassData); 이 ClassID는 두 번째 저장소를로드하는 동안 Param으로 사용됩니다. var g = Store.load ({params : {ClassID : ClassData}}); 일단 상점이로드되면로드 된 모든 레코드가 표시됩니다. var selected = g.data.item; 배열의 모든 레코드 중 한 필드의 모든 값을 밀어 넣습니다. – user2677125

1

내가 제대로 이해한다면 내 생각을, 당신은 examName 새로운 배열이 가지고 노력하고 귀하의 응답 데이터에있는 각 ExamName의 내용이 있습니까? 그렇다면이 방법이 효과적입니다.

var data = {"data":[{"ExamID":1,"ExamName":"Semester-1","MaxMarks":100},{"ExamID":4,"ExamName":"Test-1","MaxMarks":10},{"ExamID":5,"ExamName":"Test-2","MaxMarks":10}]} 

var examName = []; 
for(var i = 0; i < data.data.length; i++){ 
    examName.push(data.data[i]['ExamName']); 
} 

지금 examName는 "학기-1"과 배열, "테스트-1"및 "테스트-2"입니다

+1

또는 피, 인덱스 기반 루프처럼 당신은 STH을 수행 할 수 있습니다 acc, next) {acc.push (next.ExamName); return acc}, []);' – rplantiko

+0

매우 재미 있습니다. 인덱스 기반이 아닌 인덱스를 사용하면 어떤 이점이 있습니까? –

+0

Tyler에게 감사하지만 필요한 응답을 얻지 못했습니다. var g = gridStore.load ({params : {ClassID : ClassData}}); 이것은 그리드와 연관된 저장소이며 전체 저장소의 데이터를 가져와야합니다. 로드 된 저장소의 데이터를 가져온 다음 'ExamID'필드를 가져 와서 배열에 넣어야합니다. – user2677125

0

오류 때문에 매장로드의 비동기 특성이었다 ('var에 examName = data.reduce (기능 :

var g = Store.load({ 
        params : {ClassID: ClassData }, 
        callback : function(records, operation, success){ 
        var Excerpt = []; // start with empty array 
        Ext.each(records, function(item) { 
         // add the fields that you want to include 
         var Obj = { 
          third_field: item.get('ExamName') 
         }; 
         Excerpt.push(Obj); // push this to the array 
        }, this); 

        console.log(Excerpt); 
        } 
}); 
관련 문제