Вы можете попробовать код ниже:
serviceItemForm: FormGroup;
apiForm : FormGroup;
this.apiForm = this.fb.group({
'apiurl': new FormControl(''),
'apimethod': new FormControl(''),
'headers': this.fb.array([]),
'payload': '',
});
this.serviceItemForm = this.fb.group({
'name': new FormControl('', Validators.required),
'description': new FormControl('', Validators.required),
'categoryIds': new FormControl([], Validators.required),
'tags': [],
'status': '',
'orderFormType': new FormControl([], Validators.required),
'orderFormKey': new FormControl([], Validators.required),
'workflow': [],
'orderFormAction': new FormControl('', Validators.required),
'customUI': new FormControl(''),
'api': this.apiForm,
'userGroup': []
});
boost::function
позволяет чему-либо с operator()
с правильной подписью быть связанным как параметр, и результат Вашего связываем можно назвать с параметром int
, таким образом, это может быть связано с function<void(int)>
.
Это - то, как это работает (это описание применяется одинаково для std::function
):
boost::bind(&klass::member, instance, 0, _1)
возвраты объект как это
struct unspecified_type
{
... some members ...
return_type operator()(int i) const { return instance->*&klass::member(0, i);
}
, где return_type
и int
выведены из подписи [1 112], и указатель функции и связанный параметр, на самом деле хранится в объекте, но это не важно
Теперь, boost::function
не делает никакой проверки типа: Это возьмет любой объект и любую подпись, которую Вы обеспечиваете в ее шаблонном параметре и создаете объект, это является вызываемым согласно Вашей подписи и называет объект. Если это невозможно, это - ошибка компиляции.
boost::function
на самом деле объект как это:
template <class Sig>
class function
{
function_impl<Sig>* f;
public:
return_type operator()(argument_type arg0) const { return (*f)(arg0); }
};
то, где return_type
и argument_type
извлечены от [1 117], и f
, динамично выделяется на "куче". Это необходимо для разрешения абсолютно несвязанных объектов с различными размерами, связывают с [1 119].
function_impl
просто абстрактный класс
template <class Sig>
class function_impl
{
public:
virtual return_type operator()(argument_type arg0) const=0;
};
класс, который делает всю работу, реальный класс, полученный от [1 121]. Существует один для каждого типа объекта, который Вы присваиваете [1 122]
template <class Sig, class Object>
class function_impl_concrete : public function_impl<Sig>
{
Object o
public:
virtual return_type operator()(argument_type arg0) const=0 { return o(arg0); }
};
, Который означает в Вашем случае, присвоение повышать функцию:
function_impl_concrete<void(int), unspecified_type>
(это - время компиляции, конечно) при вызове функционального объекта он вызывает виртуальную функцию своего объекта реализации, который направит вызов к исходной функции.
ПРАВОВАЯ ОГОВОРКА: Обратите внимание, что имена в этом объяснении сознательно составлены. Любое подобие живым людям или символам... Вы знаете это. Цель состояла в том, чтобы проиллюстрировать принципы.