I like this idea. I've been meaning to find/create something similar for
Groovy. As long as you can continue to the use the formal JCR API, I
don't see anything wrong with supporting informal language-specific idioms.
Justin
On 3/4/10 9:30 AM, Felix Meschberger wrote:
> Hi
>
> (from the user@ question):
>
> Without further thinking, it might be interesting to extend the
> JavaScript functionality as follows:
>
> * Have the JCR Property representation ScriptableProperty be an
> EcmaScript array, allowing indexed access to the values and allowing
> for EcmaScript Array API.
>
> Example: add a value to the property
> node.propName.push("new value");
>
> Critical here is that the ScriptableProperty would have to cope
> with the multi-value issues around this.
>
> * Allow for direct node assignment to set property values.
>
> Example: set a property to a new value (array possible)
> node.propName = "single value";
> node.anotherProp = [ "value1", "value2" ];
>
> A final note, though: Adding support for such idioms clearly separates
> the EcmaScript support from the API supported in (all) other languags.
> Specifically it would support API not supported by the core JCR API.
> This may be fine, but we have to be aware of it.
>
> Regards
> Felix
>
>
> On 04.03.2010 11:05, Erik Buene wrote:
>>> Hi
>>>
>>> What is the best way to modify a multi-value property using
> ecmascript (.esp
>>> files)?
>>>
>>> Was expecting something like this to work:
>>>
>>> var arr = node.property;
>>> arr.push("added value");
>>> node.property = arr;
>>> node.save();
>>>
>>> And it doesn't produce errors, but the value does not seem to be
> modified in
>>> the repository.
>>>
>>> The only way I have been able to do it is:
>>>
>>> var arr = node.property;
>>> arr.push("added value");
>>> var valueMap =
>>>
> (resource.adaptTo(Packages.org.apache.sling.api.resource.PersistableValueMap));
>>> var stringArray = java.lang.reflect.Array.newInstance(java.lang.String,
>>> arr.length);
>>> for(var i =0; i<arr.length; i++) {
>>> stringArray[i] = new Packages.java.lang.String(arr[i]);
>>> }
>>> vm.put("property", stringArray);
>>> vm.save();
>>>
>>> Surely, there must be a more practical way of doing this.
>>>
>>> Best regards,
>>> Erik Buene
>>>