Hi, > Tracing through the code, everything appears fine up to the point > where I try to call the stored callback. This line: > > info.key.info.value(this)); > > info.key and info.value are both valid objects, but nothing happens.
Your 'info.key' property is your observer, which I tend to suspect doesn't then have a property called 'info' on it, but that's what "info.key.info" retrieves. Then you retrieve the 'value' property from that and try to call it ("info.key.info.value(this)"). You're also passing in a 'this' value which refers to the browser window, whereas I suspect you wanted to refer to the observable object. I think this is what you meant: observerInfo.each(function(info) { info.value.call(info.key, this); }, this); ...which will call the callback setting the observer as the context (the 'this' value within the callback) and passing in the observed object -- note that to do that, I had to pass 'this' into #each as its second argument because otherwise context is lost when you call #each. But the above, by itself, won't solve the problems because I think you probably have an issue here: > this.observableChanges.get(property).set(observer, callback); Hash#set is documented as accepting a String for the key, but you're passing in other kinds of objects, not just strings. You can't rely on the key not getting converted to a string (a string that will probably be "[Object]" or similar). FWIW, I probably wouldn't use Hash for this at all, it's overkill for the 'observableChanges' property and mis-matched for the values within that. I'd probably just use a plain JavaScript object for 'observableChanges' using the property name as the key, with the value being an array of tuples for the callbacks to make. HTH, -- T.J. Crowder Independent Software Consultant tj / crowder software / com www.crowdersoftware.com On Dec 3, 9:00 pm, Wil <wil.tur...@gmail.com> wrote: > Hi all, > > I'm trying to implement a somewhat generic way for my controller > objects to listen for changes to various properties of my model > objects. I'm not a javascript expert, so there is quite possibly a > Better Way™ of solving the bigger problem - I'm open to pointers in > that direction, if my current approach is not a good idea. > > Here's the machinery I currently have in place: > > MyClass.prototype.observeValueChange = function(observer, property, > callback) { > if (this.observableChanges == null) this.observableChanges = new > Hash(); > if (this.observableChanges.get(property) == null) > this.observableChanges.set(property, new Hash()); > this.observableChanges.get(property).set(observer, callback); > > } > > MyClass.prototype.fireValueChanged = function(property) { > if (this.observableChanges == null) return; > var observerInfo = this.observableChanges.get(property); > if (observerInfo == null) return; > observerInfo.each(function(info) { > info.key.info.value(this)); > }); > > } > > Here's an example of registering to listen: > > objectOfMyObservableClass.observeValueChange(this, 'foo', function > (destination) { > alert("observed change in foo"); > > }); > > objectOfMyObservableClass.fireValueChanged("foo"); > > Tracing through the code, everything appears fine up to the point > where I try to call the stored callback. This line: > > info.key.info.value(this)); > > info.key and info.value are both valid objects, but nothing happens. > > Thanks in advance! -- You received this message because you are subscribed to the Google Groups "Prototype & script.aculo.us" group. To post to this group, send email to prototype-scriptacul...@googlegroups.com. To unsubscribe from this group, send email to prototype-scriptaculous+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/prototype-scriptaculous?hl=en.