Ufront - использование модели (которая содержит данные) между несколькими запросами
Я не очень уверен, как реализовать модель, которая может разделить свое состояние между несколькими запросами. Я имею в виду модель, которая содержит набор данных, а не модель, которая описывает, как эти данные выглядят.
Примером может служить опрос или опрос, в котором пользователь выполняет несколько вопросов, и каждый вопрос запрашивается через следующий или предыдущий маршрут в субконтроллере, где ответ или выбранное значение пользователя будет сохранено в модели и только в конец сохранен (в БД или в файл).
Я могу внедрить модель в UfrontJSApplication и получить доступ к каждому маршруту в контроллере, но тогда мой API ничего об этом не знает. Я не могу сохранить его внутри API, потому что он воссоздается при каждом новом запросе.
Идея такова:
class SurveyController extends Controller {
@inject public var surveyApi:app.api.AsyncSurveyApi;
@inject public var surveyModel:SurveyModel; // injected into UfrontJsApplication
@:route("/nextQuestion")
public function doNextQuestions(args: { index:Int } ) {
surveyModel.add(/*an item from the post vars*/);
return surveytApi.getNextQuestion(args.index) >> function(questionVO):ViewResult {
return new ViewResult(questionVO) );
};
}
//called after the last question via a button finish for example
@:route("/saveSurvey")
public function doSaveSurvey() {
//save the entire model filled up by every doNextQuestion route
return surveytApi.save(/*can't pass my model here*/) >> function(message):RedirectResult {
return new RedirectResult(message) );
};
}
}
Есть мысли по этому поводу? Может быть, решение должно быть реализовано совершенно иначе?
PS Возможно, кто-то с репутацией не менее 1500 может создать тег ufront?
3 ответа
Несколько вариантов...
Используйте UFHttpSession. Возможно, вам придется создать тот, который работает на стороне клиента, но это может быть очень просто
Map<String,Dynamic>
, Вы можете сохранить неполный опрос в промежутках между запросами.При каждом запросе сохраняйте модель в серверном API в ее наполовину завершенном состоянии.
Если вы собираетесь придерживаться построения опроса на стороне клиента, перед отправкой на опрос вы должны сделать
SurveyModel
сохраняться между запросами. Вы можете сделать это, используя внедрение зависимостей, как у вас, или просто удерживая его в статической переменной, к которой вы можете обращаться между запросами. В любом случае вы должны иметь возможность доступа к модели в вашемdoSaveSurvey()
функции и отправить его в API сsurveyApi.save(mySurvey)
,Если есть проблема с этим, было бы хорошо увидеть некоторый код для того, что
SurveyModel
а такжеSurveyApi
и как выглядит сообщение об ошибке.
Я думаю, что лучшим способом было бы сохранить ответы на клиенте, пока он просит больше вопросов, а затем отправить все через маршрут POST, например, используя парный вопрос:response:
@route(POST, "/saveSurvey")
public function doSaveSurvey(qapairs: Array<{q:Int, a:String}>) {
for(pair in qapairs) {
var question = pair.q;
var answer = pair.a;
}
}
У меня нет технического ответа, но, возможно, указатель на то, где искать.
Вы должны изучить стандарты электронного обучения, чтобы увидеть, как они предлагают реализацию моделей отстой:
- Текущий ген SCORM 2004 (используется всеми компаниями электронного обучения)
- Следующим поколением является xAPI (ранее TinCan)
Первые используют "оболочку SCORM API" (js) для хранения данных и отправки их в "LMS" по запросу приложения. Это должно быть онлайн, чтобы работать.
Лестница намного более гибкая, позволяет хранить в автономном режиме, не требует LMS... Я пока не очень хорошо знаю, но к этому стремятся компании электронного обучения.
Вы можете найти информацию о стандартах здесь http://www.adlnet.gov/index.html
NB: Я думаю, что данные, которые вы хотите сохранить в API, называются "отслеживанием" в мире электронного обучения.
Надеюсь, это поможет вам