Reescribir validador personalizado 2

Descripción simplificada del problema

soy nuevo en angular 2 y quiero implementar un validador personalizado para el control de formularios que toma el valor booleano (atributo requerido) como parámetro.
Si este parámetro es verdadero, se requiere un control de formulario, de lo contrario no se requiere.
Lo he logrado, pero no parece funcionar. Todas las entradas (control de tabla) son necesarias.
He implementado esta función que representa un validador personalizado.
 function inputRequired( requiredAttribute: boolean) {
  return (control: FormControl): { [s: string]: boolean } => {
    if (requiredAttribute === false) {
      return {'input is not required': true};
    }else {
      return null;
    }
  };
}
Lo puse en el método initform. A continuación, para el texto del formulario de entrada de mi formulario reactivo:
 text: new FormControl('', [Validators.compose([inputRequired(this.selectedOperation.inputs[i].required)])]),
Código final
private initForm() {
function inputRequired( requiredAttribute: boolean) {
  return (control: FormControl): { [s: string]: boolean } => {
    if (requiredAttribute === false) {
      return {'input is not required': true};
    }else {
      return null;
    }
  };
}
let operationName: any;
const operationInputs: FormArray = new FormArray([]);

if (this.selectedOperation.inputs != null) {
  for (let i = 0; i < this.selectedOperation.inputs.length; i++ ) {
    operationInputs.push(
      new FormGroup({
        name: new FormControl(this.selectedOperation.inputs[i].name),
        text: new FormControl('', [Validators.compose([inputRequired(this.selectedOperation.inputs[i].required)])]),
    defaultText: new FormControl(this.selectedOperation.inputs[i].defaultText),
      complexType: new FormControl(this.selectedOperation.inputs[i].complexType),
      type: new FormControl(this.selectedOperation.inputs[i].type),
      isMultivalued: new FormControl(this.selectedOperation.inputs[i].isMultiValued),
      values: new FormControl(this.selectedOperation.inputs[i].values),
      indicator: new FormControl(this.selectedOperation.inputs[i].indicator),
      required: new FormControl(this.selectedOperation.inputs[i].required),
      isSelected: new FormControl(this.selectedOperation.inputs[i].isSelected),
      simpleTypeVarietyOrComplexTypeContent: new FormControl(this.selectedOperation.inputs[i].simpleTypeVarietyOrComplexTypeContent),
      choiceContent: new FormControl(this.selectedOperation.inputs[i].choiceContent),
      inputQname: new FormControl(this.selectedOperation.inputs[i].inputQname),
        attributes: new FormControl(this.selectedOperation.inputs[i].attributes),
      children: operationInputsChildren,

      })
    );
  }
}
operationName = this.selectedOperation.name;
this.operationRequestForm = this.formBuilder.group({
    wsdlPath: [this.wsdlPath],
    name: [operationName],
    inputs: operationInputs,
  operationDateInvoke: ['', Validators.required],
  operationTimeInvoke: ['', Validators.required]
});
}
La entrada es un objeto de la clase de entrada personalizada que tiene la propiedad as requerida.
  export class CustomInput {

              constructor(public name: string, public text: string, public 
               defaultText: string,
          public complexType: boolean, public type: string, public children: 
            CustomInput[] = [],
          public isMultiValued: boolean,
          public values: string[] = [], public indicator: string, public 
           required: boolean,
          public isSelected: boolean, public 
            simpleTypeVarietyOrComplexTypeContent: number,
          public choiceContent: boolean, public inputQname: string,
          public attributes: Map<string, string> = new Map<string, string>() 
    ) {}
   }
Una operación tiene muchos elementos de entrada. Quiero crear un formulario de reacción para la acción. Si el elemento de entrada es necesario (el atributo requerido eqaul es verdadero), se requiere la entrada html asociada con el elemento de entrada de la operación.
Así que cómo puedo implementar un validador personalizado que acepte un argumento booleano, si ese argumento es cierto, entonces el control de formulario es necesario, de lo contrario no lo es.
Gracias por la actualización

Solución de referencia

Ahora, cuando miro este artículo, me doy cuenta de que no necesitas un validador personalizado en absoluto. Cuando construya el formulario, simplemente llame a una función para comprobar el valor de this.selectedOperation.inputs[i].required, si es true, establezca el validador requerido, y si no, no haga nada.
Por lo tanto, después de construir el Grupo de formas anidadas, pero antes de que la iteración termine, llame a la función:
   }); // end of formgroup build
   this.checkValidator(this.selectedOperation.inputs[i].required, i)
) // end of iteration
Y funciones:
checkValidator(bool: boolean, index: number) {
  const control = this.operationRequestForm.controls.operationInputs.controls[index].controls.text
  if(bool) {
    control.setValidators(Validators.required)
    control.updateValueAndValidity();
  }
}
Un Plunker muy simplificado que muestra que se puede utilizar con setValidators() y updateValueAndValidity()Texto original:
Sin probar el Código (es decir, si hay otros problemas), en realidad lo invierte en un validador personalizado. Quieres...

if requiredAttribute is true the form control is required, else it is not required


Ahora, lo contrario se hace en el validador personalizado.
Curiosamente, null se considera válido para el formulario de validación, y cualquier cosa que devuelva se considera inválida. Por lo tanto, su validador personalizado realmente debe ser como sigue:
if (requiredAttribute === true) { 
  return {'inputRequired': true}; // field is required
}else {
  return null; // field is not required when 'requiredAttribute' is 'false'
}