Sample Assmt Coll
Simple test for detecting changes in assessment answerkeys
by jwstott
HTML
<script src="http://cloud.github.com/downloads/SteveSanderson/knockout/knockout-2.1.0.js"></script>
<form action='/someServerSideHandler'>
<p>Exam:
<span data-bind='text: metadata.examName'></span>
<span data-bind='text: assessments().length'></span> questions</p>
<p><select data-bind="options: assessments, optionsText: 'name' , value: selectedAssessment" ></select></p>
<table data-bind='visible: assessments().length > 0'>
<thead>
<tr>
<th>Name</th>
<th>AnswerKey</th>
</tr>
</thead>
<tbody data-bind='foreach: assessments'>
<tr>
<td><input data-bind='value: name, uniqueName: true' /></td>
<td><input data-bind='value: answerKey, uniqueName: true' /></td>
</tr>
</tbody>
</table>
<button data-bind='click: goPrevious, enable: canGoPrevious()' >Prev</button>
<button data-bind='click: goNext, enable: canGoNext()' >Next</button>
<button data-bind='click: goFirstOpen, enable: hasOpen()' >NextOpen</button>
</form>
JavaScript
var ces = ces || {};
ces.AssessmentModel = function(question, key) {
var name = ko.observable(question),
answerKey = ko.observable(key);
return {
name: name,
answerKey: answerKey
};
};
ces.ExamModel = function(questions) {
var metadata = {
sessionName: "",
examName: ""
},
assessments = ko.observableArray(questions),
selectedAssessment = ko.observable(assessments()[0]),
openAssessments = ko.computed(function() {
return ko.utils.arrayFilter(assessments(), function(item) {
if (!item.answerKey()) {
return item;
}
});
}),
goFirstOpen = function() {
if (hasOpen()) {
selectedAssessment(openAssessments()[0]);
}
},
hasOpen = ko.computed(function() {
return openAssessments().length > 0;
}),
currentIndex = ko.computed(function() {
return assessments().indexOf(selectedAssessment());
}),
canGoNext = ko.computed(function() {
return currentIndex() < assessments().length - 1;
}),
goNext = function() {
if (canGoNext()) {
selectedAssessment(assessments()[currentIndex() + 1]);
}
},
canGoPrevious = ko.computed(function() {
return currentIndex() > 0;
}),
goPrevious = function() {
if (canGoPrevious()) {
selectedAssessment(assessments()[currentIndex() - 1]);
}
};
return {
metadata: metadata,
assessments: assessments,
openAssessments: openAssessments,
selectedAssessment: selectedAssessment,
hasOpen: hasOpen,
goPrevious: goPrevious,
canGoPrevious: canGoPrevious,
goNext: goNext,
canGoNext: canGoNext,
currentIndex: currentIndex,
goFirstOpen: goFirstOpen
...