То, как мы это делаем, это начать с данных. Большинство наших разделов имеют только один тип вопросов, но у нескольких может быть два или более типов вопросов. Каждый тип вопроса имеет factory, который может принимать JSON, который начинался как XML, и запускался через процесс преобразования и добавлял во все «крючки» каждый вопрос. У нас есть что-то, называемое "questionBuilder", которое смотрит на имущество questionType
на каждый раздел и смотрит в $injector
для questionType + 'Factory'
.
Редактировать: вы можете думать о строителе, как о том, когда вы заказываете что-то из Amazon. Амазонка не знает, как сделать кофейник или банку теннисных мячей. То, что у него есть, - это длинный список поставщиков, который do умеет делать эти вещи. Поэтому, когда вы заказываете у Amazon, он входит в список фабрик, которые поставляют эти вещи, вытаскивает тот, который может сделать кофейник, и спрашивает фабрику для кофейника. Затем он вставляет его в коробку и отправляет его вам.
Угловой как ИБП. Он не знает и не заботится о том, что находится в коробке. Когда вы дойдете до представления, вы вытащите ящики, на которые вы сейчас волнуетесь. Ваш вид понимает тип вопроса (точно так же, как вы знаете, как использовать этот кофейник, или вы можете узнать).
Удобно, Угловой также как и список поставщиков (или инжектор). Все, что знает инжектор $, вы можете вытащить в своем застройщике, так как вы можете иметь любые фабрики, которые вам нужны, не загромождая ваш код кучей логики, чтобы жестко закодировать зависимости на конкретных фабриках. Вы смотрите в форварде $ для фабрики, который соответствует типу вопроса, указанному в данных.
Если в разделе указано более одного типа вопросов, мы указываем «составной» для questionType. CompositeFactory рассматривает свойство каждого вопроса, чтобы выяснить, где искать в $injector
для завода. Он также рассматривает информацию в этом разделе, в которой говорится, что она добавляет свойство к каждому вопросу, который сообщает о представлении далее в строке, частичной для использования в ng-include.
Каждый тип вопроса имеет свой собственный каталог функций, содержащий модуль, в котором говорится, какие маршруты соответствуют тем представлениям, которые идут с этой функцией (некоторые из наших типов вопросов имеют разные варианты, основанные на потребностях клиента). Композитная функция имеет единый вид, который в основном просто втягивает часть ng-include, которая была добавлена ранее на фабрике. Частично может быть либо непосредственно что-то из одного из каталогов функций, либо оболочка для одной из директив-функций, в зависимости от того, что нам нужно и как оно было изначально построено.
Я думаю, что Moodle (LMS) делает что-то похожее на ваши требования, он может обрабатывать различные типы вопросов/типов вопросов. Посмотри на это. – CodeTweetie