Roku Developer Program

Developers and content creators—a complete solution for growing an audience directly.
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
ioan
Level 10

Passing an array through interface field?

I have this array, a = [{id: 1, checked: false}, {id: 2, checked: true}] and I want to pass it to a task. I tried declaring the interface 
<field id = "checkedlist" type = "array" /> or <field id = "checkedlist" type = "assocarray"  /> 
but when I try to assign the a to it, it doesn't work. Here is what I tried:

m.save = createObject("roSGNode", "ConfigTask")
 m.save.checkedlist = a
 m.save.isarray = true
 m.save.isdone = false
 m.save.observeField("isdone", "closeThis")
 m.save.control = "RUN"


I also tried m.save.checkedlist.Append(a) and to push each element separately, but I always get error. What's the right way to do this?
https://github.com/e1ioan/
http://rokucam.com
0 Kudos
5 REPLIES 5
juantwc
Level 7

Re: Passing an array through interface field?

Hey

If you look here https://sdkdocs.roku.com/display/sdkdoc/interface you will see that the type of array you are trying to pass is not one of the supported types. The choice of supported types is a bit strange to be honest, but i digress.

In your case probably the best you can do is declare the field

<field id = "checkedlist" type = "assocarray"  /> 


And then wrap you array inside an assocarray, which should look something like this:

a = { 
checkedList :  [{id: 1, checked: false}, {id: 2, checked: true}]
}


And then pass it to your task. 
0 Kudos
EnTerr
Level 11

Re: Passing an array through interface field?

"juantwc" wrote:
If you look here https://sdkdocs.roku.com/display/sdkdoc/interface you will see that the type of array you are trying to pass is not one of the supported types. The choice of supported types is a bit strange to be honest, but i digress.

you are right re RSG bizarrely "reinventing" the data types of Brightscript -
but let's regress (dis-digress? pro-gress?): "array" is now one of the supported types (since 7.5)
You can have now array of dictionaries, dictionary of arrays or nest them any which way - just as in JSON.
0 Kudos
EnTerr
Level 11

Re: Passing an array through interface field?

"ioan" wrote:
... I also tried m.save.checkedlist.Append(a) and to push each element separately, but I always get error. What's the right way to do this?

That won't work between threads for sure, because `m.save.checkedlist` creates a local (deep) copy, to which appends `a` - and then the result will be dropped - the original `m.save.checkedlist` remaining unaffected.

By the way, note that `.append()` method name is a misnomer - if you come from e.g. Python background and think that adds 1 element to the end of the list, you'd be gravely mistaken - what it does instead is `list.extend(x)` in Python vernacular - i.e. it expects `x` to be an array of elements. Experiment in console first.

Python            Brightscript
------            ------------
list.append(elm)  roArray.push(elm)
list.extend(lst)  roArray.append(lst)
0 Kudos
EnTerr
Level 11

Re: Passing an array through interface field?

"ioan" wrote:
I have this array, a = [{id: 1, checked: false}, {id: 2, checked: true}] and I want to pass it to a task. I tried declaring the interface 
<field id = "checkedlist" type = "array" /> or <field id = "checkedlist" type = "assocarray"  /> 
but when I try to assign the a to it, it doesn't work. Here is what I tried:
m.save = createObject("roSGNode", "ConfigTask")
 m.save.checkedlist = a
...


For troubleshooting purposes, let's try doing this in the simplest way possible - do not even declare it - just do

m.save.addFields({checkedlist: [{id: 1, checked: false}, {id: 2, checked: true}]})
? formatJSON(m.save.checkedlist)

Does it work?
0 Kudos
ioan
Level 10

Re: Passing an array through interface field?

"EnTerr" wrote:

Does it work?


I'll test it tomorrow and let you know. BTW, I released a beta for the IP Camera Viewer channel.
https://github.com/e1ioan/
http://rokucam.com
0 Kudos