我們這樣做的方式是從數據開始。我們大多數的部分只有一種類型的問題,但有幾種可以有兩種或更多類型的問題。每個問題類型都有一個factory,它可以接受以XML開頭的JSON,並通過轉換過程運行,並添加每個問題所需的所有「掛鉤」。我們有一個叫做"questionBuilder"的東西,它會查看每個部分的questionType
屬性,並在$injector
中查找questionType + 'Factory'
。
編輯:您可以像從亞馬遜訂購東西時那樣想到建造者。亞馬遜不知道如何製作咖啡壺或一罐網球。它所擁有的是一個很長的供應商清單,做知道如何做這些事情。所以,當你從亞馬遜訂購時,它會出現在供應這些東西的工廠清單中,拉出可以製作咖啡壺的那個工廠,並要求工廠提供咖啡壺。然後將它粘在一個盒子裏並運送給你。
角度就像UPS。它不知道或不在意盒子裏的東西。當你看到視圖時,你可以拿出那些你現在關心的問題。你的觀點了解問題類型(就像你知道如何使用那個咖啡壺,或者你可以找到)。
方便的是,Angular也與供應商列表(或$注入器)類似。 $注入器知道的任何東西,你都可以在你的構建器中找到,這就是你可以擁有任何你需要的工廠,而不必用一堆邏輯來混淆代碼,以便對特定工廠的依賴關係進行硬編碼。您正在查找與數據中指定的問題類型相匹配的工廠的$注入器。
如果在該部分中有多個問題類型,我們會放下questionType的「composite」。 compositeFactory查看每個問題的屬性,以確定在工廠中尋找$injector
的位置。它還會查看部分中的信息,告訴它爲每個問題添加一個屬性,該屬性將進一步向下查看部分在ng-include中使用的視圖。
每個問題類型都有自己的特徵目錄,其中包含一個模塊,該模塊說明哪些路線匹配與該特徵一起使用哪些視圖(我們的一些問題類型根據客戶需求具有不同的變體)。複合功能具有單一視圖,基本上只是拉入工廠之前添加的ng-include部分。部分可能直接來自特性目錄之一,也可能是某個功能指令的包裝,這取決於我們需要的以及它最初的構建方式。
我想Moodle(LMS)做了類似於您的要求,它可以處理不同類型的問題/問題類型。看看它。 – CodeTweetie