On Fri, Nov 20, 2009 at 8:17 AM, Alex Black <a...@alexblack.ca> wrote:

> Thanks Ross, that helps a lot.
>
> As a Lift newbie, I'm curious, would it be possible (in a future
> version of list) to re-use snippet instances for all calls during an
> HTTP request? Then people could share data between snippet methods
> (within a single snippet) by just writing regular member variables.
>

We made this change for Lift 1.1.  So, if you're using 1.1, the same
instance of a snippet should be used for a given HTTP request.


>
> I'd imagine lift could even generate a requestVar representing each
> snippet for the developers, allowing snippets in a given HTTP request
> to access each other easily.
>

I don't think this is technically possible within the bounds of the type
system.


>
> On Nov 20, 11:09 am, Ross Mellgren <dri...@gmail.com> wrote:
> > RequestVar is the standard way of doing this. For example
> >
> > object MySharedInformation {
> >      object myData extends RequestVar[List[Thing]](loadThings)
> >      //                               ^^^^^^^^^^^  ^^^^^^^^^^
> >      //                    Type of thing to store  How to initialize
> > variable first time it's accessed
> >
> >      private def loadThings: List[Thing] = ...
> >
> > }
> >
> > class Snippet1 {
> >      import MySharedInformation.myData
> >      def render(ns: NodeSeq): NodeSeq = {
> >          myData.is.map(thing => { ... })
> >      }
> >
> > }
> >
> > class Snippet2 {
> >      import MySharedInformation.myData
> >      ...
> >
> > }
> >
> > The lifetime of the value is during the current request processing and
> > any AJAX calls related to it.
> >
> > If you really want to initialize it in a snippet, then use a Box with
> > a RequestVar, like this:
> >
> > object MySharedInformation {
> >      object myData extends RequestVar[Box[List[Thing]]](Empty)
> >
> > }
> >
> > class LoaderSnippet {
> >      import MySharedInformation.myData
> >      def render(ns: NodeSeq): NodeSeq = {
> >          myData.set(Full(...))
> >      }
> >
> > }
> >
> > class ReaderSnippet {
> >      import MySharedInformation.myData
> >      def render(ns: NodeSeq): NodeSeq = {
> >          // If the data has not been loaded, default to an empty list
> >          val data = myData.is.openOr(Nil)
> >          ...
> >      }
> >
> > }
> >
> > class OtherReaderSnippet {
> >      import MySharedInformation.myData
> >      def render(ns: NodeSeq): NodeSeq = {
> >          // Do two entirely different things if the data has versus
> > has not been loaded
> >          myData.is match {
> >              case Full(data) => // do something when the data has been
> > loaded
> >              case _ => // do something when the data has not been loaded
> >          }
> >      }
> >
> > }
> >
> > HTH,
> > -Ross
> >
> > On Nov 20, 2009, at 10:59 AM, Alex Black wrote:
> >
> > > I've got a template page, say foobar.html, that makes a number of
> > > calls to functions in a snippet, e.g. mysnippet.foo1, mysnippet.foo2,
> > > mysnippet.foo3.
> >
> > > I'd like to do some initial work in foo1, e.g. retrieve some data and
> > > do some work on it, then in foo2 and foo3 display parts of that data.
> >
> > > Whats the easiest way to do this? I think I misunderstood the lift
> > > book:
> >
> > > "That means that for each request, Lift creates a new instance of the
> > > snippet class to execute. Any changes you make to instance variables
> > > will be discarded after the request is processed."
> >
> > > I thought this meant that for a given HTTP request, there would be one
> > > (and only one) instance of my snippet, so I could call several of its
> > > methods and they could all access the snippet's member variables,
> > > which would then be discarded at the end of the request.
> >
> > > Am I going about this wrong? should I only have one snippet function
> > > per template?
> >
> > > Thx
> >
> > > - Alex
> >
> > > --
> >
> > > You received this message because you are subscribed to the Google
> > > Groups "Lift" group.
> > > To post to this group, send email to lift...@googlegroups.com.
> > > To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> > > .
> > > For more options, visit this group athttp://
> groups.google.com/group/liftweb?hl=
> > > .
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Lift" group.
> To post to this group, send email to lift...@googlegroups.com.
> To unsubscribe from this group, send email to
> liftweb+unsubscr...@googlegroups.com<liftweb%2bunsubscr...@googlegroups.com>
> .
> For more options, visit this group at
> http://groups.google.com/group/liftweb?hl=.
>
>
>


-- 
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 lift...@googlegroups.com.
To unsubscribe from this group, send email to 
liftweb+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=.


Reply via email to