【问题标题】:Dynamic questionnaire in FlexFlex 中的动态问卷
【发布时间】:2013-01-27 23:45:01
【问题描述】:

我想在 Flex 3 中为问卷制作一个模板,该模板读取动态 XML 文件并创建一份问卷。示例 XML:

<test>

<question>
  <q>Who was born earlier?</q>
  <answer value="true">Vincent van Gogh</answer>
  <answer value="false">Piet Mondrian</answer>
</question>

<question>
  <q>What color is Dutch national flag?</q>
  <answer value="false">blue, red and green</answer>
  <answer value="false">green, red and white</answer>
  <answer value="true">blue, red and white</answer>
</question>

<question>
  <q>Which season is the coldest?</q>
  <answer value="false">fall</answer>
  <answer value="true">winter</answer>
  <answer value="false">spring</answer>
  <answer value="false">summer</answer>
</question>

</test>

问题和答案的数量可能会有所不同。计划是使用带有单选按钮的嵌套中继器(一个用于问题,另一个用于答案)。我可以将所有 question.q 保存到 ArrayCollection,但是如果每个问题中很少有具有相同“答案”标签的答案,我应该如何处理我的答案?以及如何访问每个“值”属性,以检查用户是否选择了正确答案?

【问题讨论】:

    标签: xml apache-flex


    【解决方案1】:

    您需要从 XML 创建域模型。不要跳过这一步,因为它比你想象的更容易做而且更直接。首先创建一个简单的类:

    public class Question {
       public var question : String;
       public var answers : ArrayCollection = new ArrayCollection();
    
       public Question( node : XML ) {
          question = node.q.text();
          for each( var answer : XML in question.answer ) {
              answers.addItem( new Answer( answer ) );
          }
       }
    }
    
    public class Answer {
       public var text : String;
       public var correct : Boolean;
    
       public Answer( node : XML ) {
          text = node.text();
          correct = Boolean(node.@value);
       }
    }
    

    像这样填充节点的 ArrayCollection:

    var questions = new ArrayCollection();
    for each( var node : XML in xml.question ) {
       questions.addItem( new Question( node ) );
    }
    

    大概就是这样。然后你的问题数组可以作为转发器的数据提供者。而 question.answers 可以作为内部中继器的中继器。

    【讨论】:

    • 看起来不错,只是有些东西不起作用,我不知道为什么.. :) 我创建了 2 个带有问题和答案类的文件。然后,我通过 HTTP 服务获取我的 xml 文件并保存: xml = questionService.lastResult.question as XMLList;此时一切正常,因为我跟踪(xml)并且没关系。然后我尝试使用您的代码填充 ArrayCollection,但它不起作用。当我尝试跟踪(问题)时,它是空的。 Questions[0] 已经超出范围。所以它没有填充它,但是为什么呢?
    • 也许我只是在课堂上做错了什么?它们应该在单独的文件中,而不是在我的主 mxml 文件中,对吗?我应该把这些文件放在树的什么地方......?我现在将它们与我的主 mxml 一起放在默认包中
    • @Cela 将问题和答案分开到他们的文件中是有意义的。我只是为您的项目(com.yoursite.questionaire)创建一个简单的包结构。我相信你能想出办法。但我不认为这是你的问题。您要查找的问题是您是否进入了第一个 for 循环?如果是这样,它会进入你的第二个循环吗?尝试在每个循环之后跟踪语句。您可能必须执行 xml.test.q。我没有测试和编译我的代码。我只是尽我所能从记忆中工作。我还更改了 XMLList -> XML。祝你好运
    • 我使用节点上的方法 text() 对上面的代码进行了一些调整,以获取其中的文本。更改了 XMLList->XML 以防万一由于强制转换而最终为空。
    • @Cela 我想您应该根据您的数据更改 chubbard 代码中的迭代器:for each( var node : XML in questionService.lastResult.question ) {
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-07
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2012-01-21
    • 2018-07-09
    相关资源
    最近更新 更多