What you are doing is the equivalent of
Commentable.prototype.comments = []
which creates a sort of shared variable among all instances of that object. I 
guess the reason object_ID isn't being overwritten is because when you use
this.object_ID = ...;
you are overwriting the shared variable with a local variable for that 
instance. However,
this.comments.push(...);
is referencing the shared variable. So, for properties of an instance, always 
use
this.someProperty = ...;

This will work:

Commentable.prototype = {
  initialize: function(elmid) {
    this.object_ID = $(elmid);
    this.comments = [];
    this.eventOnClick = this.newComment.bindAsEventListener(this);
    Event.observe(elmid, 'click', this.eventOnClick, false);
    // save the commentable object away.
    Commentables.register(this);
  },
  ...
}


Colin


stephen O'D wrote:
> I am trying to implement something in the style of Draggables, where I
> can specify an HTML element that I want to place comments against by
> clicking on the element.  So I have copied the style of Draggables and
> created the following:
>
> <html>
>
> <head>
> <script src="javascript/prototype.js" type="text/javascript"></script>
> <script src="javascript/scriptaculous.js" type="text/javascript"></
> script>
>
> <script type="text/javascript">
>
> var Commentables = {
>   commentable: [],
>
>   register: function(commentable) {
>     this.commentable.push(commentable);
>   }
>
> }
>
> var Commentable = Class.create();
>
> Commentable.prototype = {
>   comments: [],
>   object_ID: '',
>
>   initialize: function(elmid) {
>     this.object_ID = $(elmid);
>     this.eventOnClick = this.newComment.bindAsEventListener(this);
>     Event.observe(elmid, 'click', this.eventOnClick, false);
>     // save the commentable object away.
>     Commentables.register(this);
>   },
>
>   newComment: function(event) {
>     alert('i have been clicked: '+this.object_ID.id);
>     this.comments.push('a comment on '+this.object_ID.id);
>     this.showComments();
>   },
>
>   showComments: function() {
>     this.comments.each( function(c) { alert(c) } )
>   }
> }
>
> Event.observe(window, 'load', page_loaded, false);
>
> function page_loaded(evt) {
>   var one = new Commentable('firstone');
>   var two = new Commentable('secondone');
> }
>
> </script>
>
> </head>
>
> <body>
>   <div id="firstone">some text just to give the div a width</div>
>   <div id="secondone">more text here just for padding.</div>
> </body>
> </html>
>
> So basically I have two clickable DIVs, and when you click on each, it
> displays an alert telling you which was clicked by calling newComment,
> and then displays all the comments saved against that DIV.
>
> It always displays the correct Object_ID, however when I call
> showComments, it displays an altert for every comment on ALL
> commentable objects.
>
> ie click on firstone:
>
> alert('i have been clicked firstone');
> alert('a comment on firstone');
>
> then click on secondone (without refreshing the page):
>
> alert('i have been clicked secondone');
> alert('a comment on firstone');    // ****** why is this one coming
> out too??
> alert('a comment on secondone');
>
> I reckon my understanding of how javascript works going wrong here,
> but why do the contents on the comments array for both object get
> shown when I thought that only the contents of the one associated with
> the DIV I click on should?  Have I created my objects wrong?
>
> Any help is much appreciated as I am baffled about this one!
>
> Thanks,
>
> Stephen.
>
>
> >
>
>   


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby 
on Rails: Spinoffs" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/rubyonrails-spinoffs?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to