빠른 설문 조사를 만들기 위해 EXT-JS 4.0을 사용하는 간단한 응용 프로그램을 작성하고 있습니다. 질문과 응답 옵션은 포함 된 JSON 객체를 통해 동적으로 표시됩니다. 각 질문에는 DisplayField 인스턴스 (xtype: 'displayfield'
)를 사용하여 표시된 텍스트가 있으며 응답 옵션과 함께 Ext.form.Panel
인스턴스에 있습니다. JSON 객체에 따라 응답은 자유 텍스트 (TextAreaField
사용), 선택 사항 1-many (라디오 버튼 사용) 또는 다수 (many-of-many) (확인란 사용) 일 수 있습니다.Ext-JS 4.0 : ViewPort 자동 스크롤 및 필드 값을 얻을 수 없습니다.
JSON 객체를 디코딩 한 후 일반 for
루프가있는 질문을 반복하여 필요한 위젯 (패널, 질문 텍스트, 텍스트 영역, 확인란 및 라디오 버튼을 포함하고 테스트를위한 제출 버튼)을 동적으로 만듭니다. . 루프가 끝나면이 패널을 컨테이너에 layout: 'vbox'
으로 추가하고 마지막으로 컨테이너를 뷰포트에 layout: 'fit'
으로 추가합니다. 이제 문제는
Ext.onReady(function() {
// Decode the received JSON object..
var jsonObj = Ext.JSON.decode(jsonObjStr);
// Array to hold the to-be-created panels for rendering in global container..
var panels = new Array();
for (i = 1; i <= jsonObj.questions.length; i++) {
// Create a Panel to contain the question..
var formPanel = Ext.create('Ext.form.Panel', {
id: 'panel' + toString(i),
frame: false,
border: true,
title: 'Question ' + i,
width: '75%',
margin: '10 0 0 0',
fieldDefaults: {
labelAlign: 'left',
labelWidth: 90,
buttonAlign: 'center',
anchor: '100%'
}
});
// Add the question text first..
var questionText = {
xtype: 'displayfield',
name: 'questionTextTf' + i,
value: '<b>' + jsonObj.questions[i - 1].question + '</b>'
};
formPanel.add(questionText);
// Add the check boxes for many-of-many answers..
var checkBoxes = new Array();
for (imultiple = 0; imultiple < jsonObj.questions[i - 1].multiple.length; imultiple++) {
var itemChk = {
name: 'cb' + i,
id: 'cb' + toString(i) + '-' + toString(imultiple),
boxLabel: jsonObj.questions[i - 1].multiple[imultiple]
};
checkBoxes.push(itemChk);
}
if (jsonObj.questions[i - 1].multiple.length > 0) {
var multipleFieldContainer = {
xtype: 'checkboxgroup',
name: 'multipleContainer' + i,
id: 'multipleContainer' + toString(i),
fieldLabel: 'Select all that match',
items: checkBoxes
};
formPanel.add(multipleFieldContainer);
}
// Add the radio buttons for one-of-many answers..
var radioBoxes = new Array();
for (isingle = 0; isingle < jsonObj.questions[i - 1].single.length; isingle++) {
var itemRdb = {
name: 'rb' + i,
id: 'rb' + toString(i) + '-' + toString(isingle),
boxLabel: jsonObj.questions[i - 1].single[isingle]
};
radioBoxes.push(itemRdb);
}
if (jsonObj.questions[i - 1].single.length > 0) {
var singleFieldContainer = {
xtype: 'radiogroup',
name: 'singleContainer' + i,
id: 'singleContainer' + toString(i),
fieldLabel: 'Select one',
items: radioBoxes
};
formPanel.add(singleFieldContainer);
}
// Add the text area field for free text comments..
if (jsonObj.questions[i - 1].comment == 'yes') {
var commentArea = {
xtype: 'textareafield',
name: 'commentTa' + i,
id: 'commentsTa' + toString(i),
fieldLabel: 'Comment'
};
formPanel.add(commentArea);
}
// Add the submit button for each question (for testing)..
var sendButton = {
xtype: 'button',
name: 'submitBtn' + i,
id: 'submitBtn' + toString(i),
text: 'Submit',
handler: function() {
Ext.Msg.alert('Info', Ext.getCmp('commentsTa' + toString(i)).getId() + ': ' + Ext.getCmp('commentsTa' + toString(i)).getValue());
}
};
formPanel.add(sendButton);
// Add panel to array of panels for later rendering..
panels.push(formPanel);
}
// Create the global container to contain all the created panels..
var mainContainer = Ext.create('Ext.container.Container', {
html: 'First Set of Preliminary Questions: <br>',
//renderTo: 'form-ct1',
style: {
borderColor: '#000000',
borderStyle: 'solid',
borderWidth: '2px'
},
layout: {
type: 'vbox',
align: 'center'
},
items: panels
});
// Create a viewport to render the global container to fill the body region of the page..
var viewport = Ext.create('Ext.container.Viewport', {
layout: 'fit',
items: mainContainer,
autoScroll: true
});
});
:
이
는 질문을 표시하는 JSON 개체의 형식입니다{questions: [{
question:'Do you know it?',
comment: 'no',
multiple: [],
single: ['yes','no']
}, {
question:'In which seasons do you use it (add your comment with your selection)?',
comment: 'yes',
multiple: ['Winter','Spring','Summer','Fall'],
single: []
}
]}
을 그리고 내 코드가
페이지에 표시 할 패널이 너무 많으면 autoscrol l의 뷰포트가 모든 후속 패널을 포함하지는 않습니다. 즉, 나는 그들 모두를 볼 수 없다!
위의 코드를 다음 패턴에 따라 설정된 위젯 (예 :
id: 'commentsTa'+toString(i)
)으로 실행하면 각 유형의 마지막 위젯 만 표시됩니다. 이것은 표현식toString(i)
이[object DOMWindow]
으로 해석되기 때문에 모두 동일한 값을 갖는 것으로 보여지기 때문입니다.toString()
을 사용하지 않으면id
이 전혀 인식되지 않으므로Ext.getCmp()
메서드를 사용할 수 없습니다.
이 문제에 대한 귀하의 도움에 감사드립니다.
나는 두 번째를 해결하기 위해 관리 발행물!! 문제는 toString() 함수에있는 것 같습니다. 내가해야 할 일은 변수를 선언하고 숫자를 문자열 (예 : var x = 1 + ''then id : 'commentsTa'+ x)로 변환하는 다른 방법을 사용하고 id 및 itemId 구성에 대한 매력처럼 작동하는 것입니다. – karimyafi