Ufront - 在多个请求之间使用模型(保存数据)

Ufront - using a model (which holds data) between several requests

我不太确定如何实现可以在多个请求之间共享其状态的模型。我的意思是一个包含一组数据的模型,而不仅仅是一个描述数据外观的模型。

一个例子是测验或调查,其中用户逐步完成几个问题,每个问题都是通过子控制器中的下一个或上一个路径请求的,其中用户的响应或选择的值将存储在一个模型,只在最后保存(到数据库或文件)。

我可以将模型注入 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) );
        }; 
    }
}

对此有什么想法吗? 也许解决方案应该以完全不同的方式实施?

P.S。 也许至少有 1500 声望的人可以创建一个 'ufront' 标签?

我认为最好的方法是在客户提出更多问题时将答案保存在客户身上,然后通过 POST 路线提交所有答案,例如使用一对 question: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 wrapper"(js)来存储数据并在应用程序请求时将它们发送到一个"LMS"。它需要在线才能工作。

阶梯更灵活,允许离线存储,不需要 LMS...我还不是很了解,但电子学习公司正在朝着它迈进。

您可以在此处找到有关标准的信息http://www.adlnet.gov/index.html#home-capabilities

注意:我认为您要存储在 API 中的数据在电子学习世界中称为 "tracking"。

希望对您有所帮助

几个选项...

  1. 使用一个UFHttpSession。您可能需要创建一个可以在客户端运行的工具,但它可能只是一个非常简单的 Map<String,Dynamic>。您可以将完成一半的调查保存到请求之间的会话中。

  2. 在每次请求时将模型保存到服务器 API,处于半完成状态。

  3. 如果您要继续构建调查客户端,在发送到调查之前,您必须使 SurveyModel 在请求之间保持不变。您可以像您一样使用依赖注入来做到这一点,或者只是将它保存在一个您可以在请求之间访问的静态变量中。无论哪种方式,您都应该能够在 doSaveSurvey() 函数中访问模型,并使用 surveyApi.save(mySurvey).

    将其发送到 API

    如果这有问题,最好看看 SurveyModelSurveyApi 的代码,以及错误消息是什么。