I know that you can return a singe property tree value like this based on the sample :
url: tree.readString("url", "")
Is there a way I can simply return all the changes at once?
I know that you can return a singe property tree value like this based on the sample :
url: tree.readString("url", "")
Is there a way I can simply return all the changes at once?
If youâre on 8.1 or higher, thereâs a PropertyTree.subscribe
method.
Thanks! Iâm probably overthinking it is there an example of this usage in the sdk or api where it returns the whole tree?
Happy to help â
Joe, Iâm assuming your snippet above was in your reducer function?
The main thing to realize is that the reducer function returns whatever you want from it. So you could (if you wanted) return the whole property tree.
Depending on the complexity, my suggestion for best testability would be to avoid returning the whole raw PropertyTree
instance from the reducer. If you need the full tree, itâs probably best to convert it to a plain javascript object using read()
or toPlainObject()
first. Iâd even recommend passing in any mutation (write) functions as âplain propsâ rather than property tree elements, as it will help avoid unnecessary tight coupling to the implementation of PropertyTree.
getPropsReducer(tree: PropertyTree): MyPropType {
return {
// will give the property tree as a plain js object, instead of an instance of PropertyTree
// this would let you read the value of the tree via `this.props.props.json`. Same result occurs if
// calling tree.read(), without passing a path parameter.
json: tree.toPlainObject()
// If you had to write to the tree's 'data' node, passing in a callback function instead of the actual
// PropertyTree will simplify unit testability of your component outside of perspective's environment.
// You would call this via this.props.props.writeData(someNewData)
writeData: (newJson) -> tree.write("data", newJson)
}
}
That all said, for performance reasons, be careful returning the whole tree even as a plain object. Depending on the nature/implementation of the properties + component, itâs easy to imagine introducing poor performance due to re-rendering when you donât need to. Itâs best to be selective if you can.
Thanks for your help!
from the sdk example,
const { props: { url }, emit } = this.props;
is how I have been getting the data in. Should I use the tree.read function instead?
what usage would you recommend for a json prop tree like below?
{
"$schema": "http://json-schema.org/draft-04/schema#",
"Item1":
"blabla",
"type": "object",
"properties": {
"booleanOne":{
"default": false
},
"Item1":{
"default":"Text 1"
},
"Item2":{
"default":"Text 2"
},
"text1": {
"type": "string",
"description": "text input 1.",
"default": "blabla 1"
},
"text2": {
"type": "string",
"description": "text input 1",
"default": "blabla 2"
},
}
,
"style": {
"$ref": "urn:ignition-schema:schemas/style-properties.schema.json"
},
"position": {
"rotate": {
}
},
"custom": {}
}
Would this be the correct usage ?
Using this way, I can change a property value by a binding.
I bound a text box value to the property.
In the browser I put âHappy Fridayâ in the box
with a button click I print the tree value that was bound.
I can see that the property tree is updated with the value âHappy Fridayâ
however âHappy Fridayâ is not passed to the object itself.
export interface ModProps {
json: any;
}
âŚ
render() {
const { props } = this.props;
const json: string = this.props.props.json;
use values
}
getPropsReducer(tree: PropertyTree): ModProps {
return {
json: tree.read()
};