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=.