Both. Very good explanation with consistent analogies, a difficult
subject to explain, and no charge.
Nice one!
On 15/09/2011 19:11, Aaron Newton wrote:
Um. Thanks? Do you mean the code? Or that email?
On Thu, Sep 15, 2011 at 10:35 AM, Lee <[email protected]
<mailto:[email protected]>> wrote:
Aaron - superb writing!
On 15/09/2011 17:53, Aaron Newton wrote:
What you're looking for is an event arbitrator. ... which is
what Behavior is (and Delegator, too).
You write your Classes with event hooks like normal
(onComplete, onLoad, onShow, onHide, etc). And then you fire
events against Behavior that your filters can look for. Here's
an example:
https://github.com/anutron/more-behaviors/blob/master/Source/Forms/Behavior.OverText.js#L27
This line adds an event to the Behavior instance that's
invoking the filter. When that behavior instance fires the
event "layout:display" it invokes that callback.
Or here, a delegator that fires events when it updates the DOM:
https://github.com/anutron/more-behaviors/blob/master/Source/Delegators/Delegator.Ajax.js#L58
This allows two filters to pass messages to each other (or the
classes they instantiate to do so) by using the
addEvent/fireEvent methods on the api. So if you have Class A
that fires and event that Class B needs to know about, your
filter, which creates those instances, can do so, even if the
other doesn't exist.
On Thu, Sep 15, 2011 at 7:09 AM, Eric Patrick
<[email protected] <mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>>
wrote:
Thanks for the feedback.
I will be happy to release them once I've kicked the tires.
Trying to
make them really reusable begets another question with
respect to
event delegation.
I have a series of very specific classes (Contact, Message,
Attachment, etc) that represent business objects and
communicate via
web services. Typically these classes have a target DOM
element they
use to display their content.
I then have generic behavior to field things like
pagination of a list
of Contacts (or Messages, or Attachments, etc.).
When a pagination event fires, I essentially want my
Contact class to
listen for it.
Option 1: create an custom event on Element
Create a custom event on Element (Element.paginate, based
on the click
handler), and have the Contact's DOM element listen for the
paginate
event.
However, that strikes me as "resource intensive". I may well
misunderstand, but the Element.paginate's condition
function would be
evaluated on every mouse click on every element. Given the
complexity
of some of my pages, I'm worried about performance.
I had hoped something like this would work instead:
http://jsfiddle.net/kBGLQ/
Option 2:
In my Paginate behavior, I call a global function to find
and return
the containing class (Contact), and fire a custom event on the
class.
This works, and strikes me a reasonably efficient. However,
it ties my
Paginate behavior to the existence of very specific classes.
See http://jsfiddle.net/wB3n7/1/
Option 3:
I suspect I'm missing a more generic, equally efficient option.
Thanks as always,
Eric
On Sep 14, 2:32 pm, Aaron Newton <[email protected]
<mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>> wrote:
> Hi Eric,
>
> Thus far I haven't worried about namespacing filters. Remember
that you
> control which ones are loaded and which ones are in effect.
Behavior
> instances can have local filters that override globals, etc.
>
> If, however, you want to be safe, you could use any of the
examples below. I
> don't know if I have a preference.
>
> Are you going to release these behaviors? I'd love to see more
people
> publishing them...
>
>
>
>
>
>
>
> On Wed, Sep 14, 2011 at 10:09 AM, Eric Patrick
<[email protected] <mailto:[email protected]>
<mailto:[email protected] <mailto:[email protected]>>>
wrote:
> > Thanks for the Behavior / BehaviorAPI Aaron; it's great to
work with!
>
> > I am developing a bunch of behaviors centered on dealing with
AJAX-
> > loaded data grids:
>
> > - Paginate: handles creation of DOM elements for a
pagination row,
> > raising an event when a page or display size is changed
> > - OrderBy: handles making column headers sortable
> > - Filter: handles modification of JSON from a form to
re-submit via
> > Request.HTML or Request.JSON
>
> > It occurs to me others may do something similar. Any
thoughts or
> > advice on "name spacing" behaviors?
>
> > <div data-behaviors="Paginate, Filter"/>
>
> > vs. my name space (mns)
>
> > <div data-behaviors="mns.Paginate, mns.Filter"/>
>
> > vs.
>
> > <div data-behaviors="mns-Paginate, mns-Filter"/>
>
> > vs.
>
> > <div data-behaviors="mnsPaginate, mnsFilter"/>
>
> > Thanks in advance,
>
> > Eric