On Sun, Nov 15, 2009 at 12:45 PM, DMB <[email protected]> wrote:
>
> I guess the underlying problem I have is that I don't know how one
> object can get a reference to another. Maybe I'm just trying to use
> OOP when I need to be functional, I don't know. I basically want the
> time selector to be completely separate from thumbnail JSON generator
> so that I could compose the two as needed. In the OOP paradigm this is
> trivial - just put them into a common object, initialize them before
> render, and be done with it. In Lift, I don't even know when (and how)
> the classes that contain snippet functions are instantiated, let alone
> how to get a reference from one to another.
>
You're in luck, Scala has singletons, so you never have to worry about how
to access something.
In a the "MyStuff.scala" file in the lib package:
package com.mycode.lib
import net.liftweb._
import http._
object MyWackyStuffThatNeedsToBeCalculatedOncePerRequest extends
RequestVar(calculateIt)
def calculateIt = {.....}
Now, in your snippet or whatever code is spewing content as part of the
HTTP request:
import com.mycode.lib
class MySnippet {
def render = {
val theValue = MyWackyStuffThatNeedsToBeCalculatedOncePerRequest.is
<span>The value is {theValue}</span>
}
}
Voila... no need to do anything other than reference the MyWackyStuff
singleton and everything else is done for you.
Does this help?
Thanks,
David
>
> What I ended up doing is I put both time selector code and JSON
> generator code into the same class and made them refer to a set of
> common, lazily initialized vars. This is not optimal, but I couldn't
> come up with anything more elegant than this off the top of my head.
>
> On Nov 15, 12:08 pm, David Pollak <[email protected]>
> wrote:
> > On Sun, Nov 15, 2009 at 2:46 AM, DMB <[email protected]> wrote:
> >
> > > Here's a simple problem. I have a web page which is supposed to
> > > display a gallery.
> >
> > > The page has two snippets in it. One of the snippets is month/year
> > > selector, which takes (in the order of priority) URL parameters or
> > > cookies and renders year/month selections accordingly. This month/year
> > > selector also retrieves from the DB the list of available years, and
> > > then for a selected year, list of available months, so if no cookies
> > > or url parameters are available it picks the latest available month
> > > and year.
> >
> > > The second part is the image viewing/browsing component itself. This
> > > component is basically a static (as in, "a file on the disk") JQuery
> > > script which takes all of its data from a JSON var that snippet is
> > > supposed to render onto the page. The problem is, by the time its
> > > rendering method is called, I must be sure that I have a valid month
> > > and year selection in the picker, otherwise I don't know what to get
> > > from the DB.
> >
> > > Coming from ASP.NET, there are several distinct phases in the page
> > > lifecycle and I can always guarantee that one will finish before the
> > > other, and stuff the state into my page object, or the session object,
> > > or request object.
> >
> > > Coming from Ruby, I can stuff the date picker section and thumbnails
> > > section as partials into the same view, and they will share the same
> > > variables, which I will assign from the controller method, thus
> > > guaranteeing the order of execution.
> >
> > > With Lift, my snippets are nothing but functions, and I haven't seen
> > > any guarantees that one will be called before the other. How do I
> > > guarantee that by the time JSON needs to be rendered I already have a
> > > valid month and year selected?
> >
> > > I'm most likely missing something trivial here, could someone give me
> > > a hint?
> >
> > Lift is built on Scala. Scala is good at being lazy... evaluating code
> only
> > when needed and only evaluating the code once.
> >
> > Lift has a class called RequestVar. You can use it to calculate/store a
> > value during a single HTTP request/response cycle (and the calculated
> value
> > is retained for subsequent Ajax calls).
> >
> > Syntactically:
> >
> > object MyMonth extends RequestVar(calculateValue)
> >
> > def calculateValue = look at cookies or look at request params or look at
> > database or this month
> >
> > When you call MyMonth.is the first time during the servicing of a request
> > (presuming you have not explicitly set the value), calculateValue will be
> > called and you can do whatever logic you want. Subsequent calls the
> > MyMonth.is will return the calculated/cached value.
> >
> > Does that help?
> >
> > Thanks,
> >
> > David
> >
> >
> >
> > --
> > Lift, the simply functional web frameworkhttp://liftweb.net
> > Beginning Scalahttp://www.apress.com/book/view/1430219890
> > Follow me:http://twitter.com/dpp
> > Surf the harmonics
> >
>
--
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Surf the harmonics
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Lift" 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/liftweb?hl=en
-~----------~----~----~----~------~----~------~--~---