【问题标题】:AngularJS: Different Views and Different Controller by DataAngularJS:不同的视图和不同的数据控制器
【发布时间】:2023-03-31 17:45:01
【问题描述】:

假设我想制作一个测验页面。我有不同的问题类型。 IE。任务是找到正确的顺序,选择一个答案,选择多个答案,或者用预定义的单词填充一些空格等等。所以,我在数据上下文中有 5 个问题。其中2道选择题,1道正确顺序题,2道完形填空题。要点是:我不知道当前测验中有多少不同的问题类型。他们都需要一个自己的视图、一个自己的控制器和一个自己的数据模型,因为没有通用的数据模型可以同时适用于完形填空和正确顺序问题(请纠正我,如果我错了)。

一般来说,AngularJS 和 MVC 模式中最好的方法是什么?这甚至适用吗?这是否与一般的 MVC 模式相矛盾?

【问题讨论】:

  • 我猜 Moodle (LMS) 做的事情与您的要求相似,它可以处理不同类型的问题/问题类型。看看吧。

标签: angularjs model-view-controller


【解决方案1】:

所以您有 5 个问题,我会针对这些问题做一个ng-repeat,并针对您想要的每个视图做一个ng-switch

<div ng-repeat="question in questions" ng-switch="question.questionType">
  <div ng-switch-when="MultipleChoice" ng-controller="MultipleChoiceCtrl">
    ... multiple choice
  </div>
  <div ng-switch-when="RightOrder" ng-controller="RightOrderCtrl">
    ... right order
  </div>
</div>

【讨论】:

    【解决方案2】:

    我们这样做的方式是从数据开始。我们的大部分部分只有一种类型的问题,但有些部分可以有两种或多种类型的问题。每个问题类型都有一个factory,它可以采用以 XML 开头并通过转换过程运行的 JSON,并添加每个问题所需的所有“钩子”。我们有一个叫做"questionBuilder" 的东西,它查看每个部分的questionType 属性,并在$injector 中查找questionType + 'Factory'

    编辑:当您从亚马逊订购商品时,您可以将建筑商视为类似。亚马逊不知道如何制作咖啡壶或网球罐。它所拥有的是一长串确实知道如何制造这些东西的供应商。因此,当您从亚马逊订购时,它会进入提供这些东西的工厂列表,拿出可以制作咖啡壶的工厂,然后向工厂索要咖啡壶。然后它把它粘在一个盒子里然后寄给你。

    Angular 就像 UPS。它不知道也不关心盒子里有什么。当您到达视图时,您会拉出您目前关心的问题的框。您的视图了解问题类型(就像您知道如何使用那个咖啡壶一样,或者您可以找出答案)。

    方便地,Angular 也类似于供应商列表(或 $injector 是)。 $injector 知道的任何东西,你都可以从你的构建器中提取出来,这样你就可以拥有你需要的任何工厂,而不会用一堆逻辑来混淆你的代码来硬编码特定工厂的依赖关系。您正在 $injector 中查找与数据中指定的问题类型相匹配的工厂。

    如果该部分中有多个问题类型,我们会为 questionType 设置“复合”。 CompositeFactory 查看每个问题的属性以确定在$injector 中查找工厂的位置。它还查看部分中的信息,该部分告诉它为每个问题添加一个属性,该属性告诉进一步的视图在 ng-include 中使用哪个部分。

    每种问题类型都有其自己的功能目录,其中包含一个模块,该模块说明哪些路线与该功能附带的哪些视图相匹配(我们的一些问题类型根据客户需求有不同的变化)。复合功能具有单一视图,基本上只是拉入之前在工厂中添加的 ng-include 部分。部分可能是直接来自某个功能目录的内容,也可能是某个功能指令的包装器,具体取决于我们需要什么以及它最初是如何构建的。

    【讨论】:

    • 我不太明白 Builder 是什么以及它如何应用于 Angular。
    • Angular 本身并不真正包含业务逻辑层,因此您必须添加它。 Angular 中没有什么可以阻止你这样做。我们在用户登录后执行此操作,因此我们知道要加载哪个评估。基本上,我们首先通过读取一个 XML 文件并构建一个 assessmentMaster 来负责跟上我们在整体评估中的位置。它构建但不填充每个节数据对象,其中包含该节的 xml 在哪里等信息。在导航到每个部分之前,我们调用 section.load(),它会加载并构建问题。
    • 你不必像我们那样做,我们的逻辑可能与你需要的不匹配——我只是给出一个大纲,作为你如何做的例子在 angular 之上做你自己的事情。
    猜你喜欢
    • 1970-01-01
    • 2011-07-27
    • 2015-08-18
    • 2017-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-15
    相关资源
    最近更新 更多