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]> 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]> 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]>
> 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
>

Reply via email to