Add custom JsonConverters to ensure that JS function strings are evaluated into function when deserialized by JS #453
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Summary
This PR adds two custom JsonConverters to handle the serialization of function strings/arrays. Every property that represents a function or a CustomFunction will be serialized as a JSON object like the following:
Or in the case of a CustomFunction with multiple values:
This way, the client side deserialization logic can simply check if a JSON property's value is an object that contains the
@eval
key, and apply the function evaluations appropriately. This way there is no need to hard-code function names in the deserializer logic to check what needs to be evaluated.To mark a
string
property in the data model as a function, simply add the[JsonConverter(typeof(FunctionStringConverter))]
attribute to it. In case ofCustomFunction
properties, use[JsonConverter(typeof(FunctionValueOrListConverterConverter))]
.Things to consider
Is there any way this can break existing functionality?
Since this PR includes changes in the JS code, some browsers might load a cached version of the previous
blazor-apexcharts.js
file, which will lead to an incompatibility unless the user force-reloads the page. One possible solution is to bake the current commit hash into the path of the js file (e.g. var javascriptPath = $".../blazor-apexcharts.js?hash={commitHash}"). The commit-hash can be obtained at build time using the GitInfo package.