[Laszlo-dev] Do we really need top-level name => id idiom?

P T Withington ptw at laszlosystems.com
Thu Apr 10 03:09:09 PDT 2008


On 2008-04-10, at 03:28 EDT, André Bargull wrote:
> `lzAddLocalData` is _not_ used for local datasets, it is used for  
> top-level datasets, see "DataCompiler.java". So that's a compile  
> time issue, which shouldn't be a problem even in swf9.

So just a convention, which we could change, and still be transparent  
to the LZX user.

I've observed in the past that datasets seem to get defined in 3  
places: globally, on the canvas, and in canvas.datasets.  This would  
seem like overkill.  Perhaps we could limit them to being defined in  
just two places, or maybe even one?

> These two constructs no longer work to create a global object:
> new <lznode subclass>(canvas, {name: 'foo'});
> new <lznode subclass>(canvas, {id: 'foo'});

That's what I am proposing.  The replacement would be:

[At the top level of your program]

   var foo;

[Anywhere else in your program where `foo` is lexically apparent]

   foo = new <lznode subclass>(canvas, ...);

This is not a full replacement, since the foo object will not know  
what global it had been bound to.

> Hm, would it make sense to integrate "as3 global-support" like this "http://www.uza.lt/codex/as3-global-object/ 
> "? That way you can create code which works in all runtimes,
> provided that everyone uses "global.foo" to access a global object.

We already have that in a sense.  Any top-level object will be a child  
of the canvas, so named objects on the canvas are always accessible as  
`canvas.<name>`.  We could say that an object with an id similarly  
becomes accessible through the canvas as `canvas.<id>`.

The plus of going this way is there would be no collisions with  
runtime globals.  The minus would be that everyone would need to be re- 
trained to qualify their free references.  That would probably not be  
acceptable...

What I am proposing is just a restriction on JS dynamic creation of  
nodes.  At the LZX level, we already state that node `name` and `id`  
properties are final.  I'm proposing a restriction that at the JS  
level, they are not properties of node at all; that if you want your  
node to be a global value or a property, you do it yourself.

> On 4/10/2008 2:11 AM, P T Withington wrote:
>> Because I can't see how to implement that at runtime in swf9.
>>
>> Currently, if I say:
>>
>>  new <lznode subclass>(canvas, {name: foo});
>>
>> the global `foo` will be bound to my instance.  In particular, this  
>> idiom is currently used by `lzAddLocalData` and `lzpreloader`.  Do  
>> local datasets really need to be stored as globals?  This seems  
>> like namespace pollution to me.  We can't do this in swf9 because  
>> swf9 does not let you dynamically add global names.
>>
>> I would like to remove support for a top-level name acting as an  
>> id.  In fact, our documentation says that both `name` and `id` are  
>> final, which would indicate to me that you should not be able to  
>> supply them at run time at all. IWBRN to remove this wart.
>>




More information about the Laszlo-dev mailing list