public virtual ExpressionSyntax EmitCreateBinding(DefaultViewCompilerCodeEmitter emitter, ResolvedBinding binding, string id, Type expectedType) { var compilerAttribute = GetCompilationAttribute(binding.BindingType); var requirements = compilerAttribute.GetRequirements(binding.BindingType); var expression = new Lazy <Expression>(() => compilerAttribute.GetExpression(binding)); var compiled = new CompiledBindingExpression(); compiled.Delegate = TryExecute(binding.BindingNode, "Error while compiling binding to delegate.", requirements.Delegate, () => CompileExpression(compilerAttribute.CompileToDelegate(binding.GetExpression(), binding.DataContextTypeStack, expectedType), binding.DebugInfo)); compiled.UpdateDelegate = TryExecute(binding.BindingNode, "Error while compiling update delegate.", requirements.UpdateDelegate, () => compilerAttribute.CompileToUpdateDelegate(binding.GetExpression(), binding.DataContextTypeStack).Compile()); compiled.OriginalString = TryExecute(binding.BindingNode, "hey, no, that should not happen. Really.", requirements.OriginalString, () => binding.Value); compiled.Expression = TryExecute(binding.BindingNode, "Could not get binding expression.", requirements.Expression, () => binding.GetExpression()); compiled.Id = id; compiled.ActionFilters = TryExecute(binding.BindingNode, "", requirements.ActionFilters, () => compilerAttribute.GetActionFilters(binding.GetExpression()).ToArray()); compiled.Javascript = TryExecute(binding.BindingNode, "Could not compile binding to Javascript.", requirements.Javascript, () => compilerAttribute.CompileToJavascript(binding, compiled)); var index = Interlocked.Increment(ref globalBindingIndex); if (!GlobalBindingList.TryAdd(index, compiled)) { throw new Exception("internal bug"); } return(EmitGetCompiledBinding(index)); }
public ValueBindingExpression(CompiledBindingExpression.BindingDelegate func, string javascript = null, CompiledBindingExpression.BindingUpdateDelegate updateFunc = null) : base(new CompiledBindingExpression() { Delegate = func, Javascript = javascript, UpdateDelegate = updateFunc }) { }
/// <summary> /// Initializes a new instance of the <see cref="BindingExpression"/> class. /// </summary> public BindingExpression(CompiledBindingExpression compiledBinding) : this() { OriginalString = compiledBinding.OriginalString; Javascript = compiledBinding.Javascript; ExpressionTree = compiledBinding.Expression; Delegate = compiledBinding.Delegate; UpdateDelegate = compiledBinding.UpdateDelegate; BindingId = compiledBinding.Id; ActionFilters = compiledBinding.ActionFilters; }
public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression compiledExpression) { var methodExpression = binding.GetExpression() as MethodCallExpression; if (methodExpression == null) { throw new NotSupportedException("static command binding must be method call"); } var argsScript = GetArgsScript(methodExpression, binding.DataContextTypeStack); return $"dotvvm.staticCommandPostbackScript('{GetMethodName(methodExpression)}', [{ argsScript }])"; }
public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression compiledExpression) { var expression = binding.GetExpression(); var visitor = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call); var rootCallback = visitor.Visit(expression); var js = SouldCompileCallback(rootCallback) ? JavascriptTranslator.CompileToJavascript(rootCallback, binding.DataContextTypeStack) : null; foreach (var param in visitor.ParameterOrder) { var callback = js == null ? null : $"function({param.Name}){{{js}}}"; var method = visitor.Replaced[param] as MethodCallExpression; js = CompileMethodCall(method, binding.DataContextTypeStack, callback); } return("var $context = ko.contextFor(this);var sender = this;(function(i_pageArea){with($context){" + js + "}})"); }
public new string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression compiledExpression, DotvvmConfiguration config) { var vmMapper = config.ServiceLocator.GetService <IViewModelSerializationMapper>(); var expression = binding.GetExpression(); var visitor = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call); var rootCallback = visitor.Visit(expression); var js = SouldCompileCallback(rootCallback) ? "resultPromise.resolve(" + JavascriptTranslator.FormatKnockoutScript(JavascriptTranslator.CompileToJavascript(rootCallback, binding.DataContextTypeStack, vmMapper), allowDataGlobal: false) + ")" : null; foreach (var param in visitor.ParameterOrder.Reverse <ParameterExpression>()) { if (js == null) { js = $"resultPromise.resolve({param.Name})"; } var callback = $"function({param.Name}){{{js}}}"; var method = visitor.Replaced[param] as MethodCallExpression; js = CompileMethodCall(method, binding.DataContextTypeStack, vmMapper, callback); } return("var $context = ko.contextFor(this);var sender = this;var resultPromise = new DotvvmPromise();(function(i_pageArea){with($context){" + js + "}})"); }
public virtual string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression) { var javascript = JavascriptTranslator.CompileToJavascript(binding.GetExpression(), binding.DataContextTypeStack); if (javascript == "$data") { javascript = "$rawData"; } else if (javascript.StartsWith("$data.", StringComparison.Ordinal)) { javascript = javascript.Substring("$data.".Length); } // do not produce try/eval on single properties if (javascript.Contains(".") || javascript.Contains("(")) { return("dotvvm.evaluator.tryEval(function(){return " + javascript + "})"); } else { return(javascript); } }
public virtual string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression) { return "dotvvm.tryEval(function(){return " + JavascriptTranslator.CompileToJavascript(binding.GetExpression(), binding.DataContextTypeStack) + "})"; }
public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression) { return $"dotvvm.postbackScript('{ expression.Id }')"; }
public CommandBindingExpression(CompiledBindingExpression.BindingDelegate command, string id) : base(new CompiledBindingExpression() { Delegate = command, Id = id, Javascript = $"dotvvm.postbackScript('{ id }')" }) { }
public ControlPropertyBindingExpression(CompiledBindingExpression expression) : base(expression) { }
public StaticCommandBindingExpression(CompiledBindingExpression expression) : base(expression) { }
/// <summary> /// Initializes a new instance of the <see cref="ResourceBindingExpression"/> class. /// </summary> public ResourceBindingExpression(CompiledBindingExpression expression) : base(expression) { }
/// <summary> /// Initializes a new instance of the <see cref="ValueBindingExpression"/> class. /// </summary> public ValueBindingExpression(CompiledBindingExpression expression) : base(expression) { }
public override string CompileToJs(ResolvedBinding binding, CompiledBindingExpression expression) { return($"dotvvm.postbackScript('{ expression.Id }')"); }
public override string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression) { return($"dotvvm.postbackScript({ JsonConvert.SerializeObject(expression.Id) })"); }
public ControlCommandBindingExpression(CompiledBindingExpression expression) : base(expression) { }
public string CompileToJavascript(ResolvedBinding binding, CompiledBindingExpression expression, DotvvmConfiguration config) { return(new JsIdentifierExpression("dotvvm").Member("postbackScript").Invoke(new JsLiteral(expression.Id)).FormatScript()); }