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 
> .
> For more options, visit this group at 
> http://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.
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=.


Reply via email to