anchor.diff:    }
   
     for (var binding in inputs) {
  -    var checkExpression = converter.convertSourceToExpression(
  -        binding.source, binding.target.type);
  -
       var inputName = (binding.target as ir.InputBinding).name;
   
       // Optimization specifically for NgIf. Since the directive already performs
       // change detection we can directly update it's input.
       // TODO: generalize to SingleInputDirective mixin.
       if (directive.identifier.name == 'NgIf' && inputName == 'ngIf') {
  -      var updateStatement = bindingToUpdateStatement(
  -          binding, directiveInstance, null, false, checkExpression);
  -      if (binding.source.isImmutable) {
  -        constantInputsMethod.addStmt(updateStatement);
  -      } else {
  -        dynamicInputsMethod.addStmt(updateStatement);
  -      }
  +      _directBinding(
  +        binding,
  +        converter,
  +        binding.source.isImmutable ? constantInputsMethod : dynamicInputsMethod,
  +        directiveInstance,
  +        null,
  +        false,
  +      );
         continue;
       }
       if (isStateful) {
  -      var updateStatement = bindingToUpdateStatement(
  -          binding, directiveInstance, null, false, checkExpression);
  -      if (binding.source.isImmutable) {
  -        constantInputsMethod.addStmt(updateStatement);
  -      } else {
  -        dynamicInputsMethod.addStmt(updateStatement);
  -      }
  +      _directBinding(
  +          binding,
  +          converter,
  +          binding.source.isImmutable
  +              ? constantInputsMethod
  +              : dynamicInputsMethod,
  +          directiveInstance,
  +          null,
  +          false);
         continue;
       }
   
  
positive.code:     // We already set the value to the text node at creation
      return;
    }
  
    var checkExpression =
        BoundValueConverter.forView(view, DetectChangesVars.cachedCtx)
            .convertSourceToExpression(binding.source, null);
    var updateStmt = bindingToUpdateStatement(
        binding, o.THIS_EXPR, compileNode.renderNode, false, checkExpression);
    view.detectChangesRenderPropertiesMethod.addStmt(updateStmt);
  }
  
  /// For each bound property, creates code to update the binding.
  
negative.code:     if (isOnPushComp || calcChangedState) {
        statements.add(DetectChangesVars.changed.set(o.literal(true)).toStmt());
      }
  
      var checkExpression = converter.convertSourceToExpression(
          binding.source, binding.target.type);
  
      _bind(
        view.storage,
  