public JsExpression CompileToJavascript(DataContextStack dataContext, Expression expression) { var currentContextVariable = new JsTemporaryVariableParameter(new JsIdentifierExpression("ko").Member("contextFor").Invoke(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter))); var resultPromiseVariable = new JsTemporaryVariableParameter(new JsNewExpression("DotvvmPromise")); var senderVariable = new JsTemporaryVariableParameter(new JsSymbolicParameter(CommandBindingExpression.SenderElementParameter)); var visitor = new ExtractExpressionVisitor(ex => ex.NodeType == ExpressionType.Call); var rootCallback = visitor.Visit(expression); var js = SouldCompileCallback(rootCallback) ? new JsSymbolicParameter(resultPromiseVariable).Member("resolve").Invoke(JavascriptTranslator.CompileToJavascript(rootCallback, dataContext, vmMapper)) : null; foreach (var param in visitor.ParameterOrder.Reverse <ParameterExpression>()) { js = js ?? new JsSymbolicParameter(resultPromiseVariable).Member("resolve").Invoke(new JsIdentifierExpression(param.Name)); var callback = new JsFunctionExpression(new[] { new JsIdentifier(param.Name) }, new JsBlockStatement(new JsExpressionStatement(js))); var method = visitor.Replaced[param] as MethodCallExpression; js = CompileMethodCall(method, dataContext, callback); } foreach (var sp in js.Descendants.OfType <JsSymbolicParameter>()) { if (sp.Symbol == JavascriptTranslator.KnockoutContextParameter) { sp.Symbol = currentContextVariable; } else if (sp.Symbol == JavascriptTranslator.KnockoutViewModelParameter) { sp.ReplaceWith(new JsSymbolicParameter(currentContextVariable).Member("$data")); } else if (sp.Symbol == CommandBindingExpression.SenderElementParameter) { sp.Symbol = senderVariable; } } return(new JsBinaryExpression(js, BinaryOperatorType.Sequence, new JsSymbolicParameter(resultPromiseVariable))); }
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 + "}})"); }