Hi Ross, Yes it's not in the same request.
My case is: When user select a tree node, I want to store this nodeId and If user click a button to create a child node, I want to get the selected node. I use ModalDialog when user click the button to create now node. On Tue, Dec 8, 2009 at 11:50 AM, Ross Mellgren <dri...@gmail.com> wrote: > I'm sorry, I'm having trouble following your code, I think too much of the > surrounding code and templates is missing for me to reason about why you > would have a problem. > > I set up a quick example app, so maybe the code from that will help you. It > is here: > > http://github.com/Dridus/test-rqvarlog > > If I understand you correctly, you're getting a log message like this one: > WARN - RequestVar test.snippet.HelloWorld$myVar$_ was set but not read > > This message is from the code I posted: > > package test.snippet > > import _root_.scala.xml.NodeSeq > import _root_.net.liftweb.http.RequestVar > import _root_.net.liftweb.util.Helpers > import Helpers._ > > class HelloWorld { > object myVar extends RequestVar[Int](0) > > def howdy(in: NodeSeq): NodeSeq = Helpers.bind("b", in, "time" -> (new > _root_.java.util.Date).toString) > > def increment(in: NodeSeq): NodeSeq = { > myVar.set(myVar.is + 1) > <div>increment called</div> > } > > def show(in: NodeSeq): NodeSeq = <div>show called -- myVar.is { > myVar.is }</div> > } > > > <lift:surround with="default" at="content"> > <h2>Welcome to your project!</h2> > <p> > <lift:helloWorld.howdy> > <span>Welcome to test-rqvarlog at <b:time/></span> > </lift:helloWorld.howdy> > > <lift:HelloWorld.increment /> > <lift:HelloWorld.increment /> > <!-- <lift:HelloWorld.show /> --> > </p> > </lift:surround> > > If I uncomment the line with HelloWorld.show in the template, the log > message goes away because myVar.is is called. > > If you are still getting the message, then that should mean that you are > not calling myVar.is in the same request. > > HTH, > -Ross > > On Dec 7, 2009, at 10:28 PM, Xuefeng Wu wrote: > > My code : > > > object CompetenceMgr { > > Menu(Loc("Competence", List("competence", "index"), S.?("Competence"), > ifIsLoggedIn, > ... > Loc.Snippet("buildCompetenceDicRows", buildCompetenceDicRows), > Loc.Snippet("addCompetenceB", addCompetenceB), > .... > > private object *_categoryId *extends RequestVar[Long](0) > > //build a competenceDic table > def buildCompetenceDicRows(xhtml: NodeSeq): NodeSeq = { > ... ... > def *makeCategoryRow*(r: Category) = { > ..... > def *categoryNode*: NodeSeq = { > def categoryNodeLinkId = "categoryNodeLinkId-" + r.id > def selectCategoryNode: JsCmd = { > * //here: set the _categoryId, but didn't work* > _categoryId.set(r.id.is) > ... .. > } > <span id={categoryNodeLinkId} class='node_span'>{a(() => > selectCategoryNode, Text(r.title.is))}</span> > } > <tr ><td><span class="folder draggable droppable" > id={categoeryId}>{categoryNode}</span></td></tr> % ("id" -> nodeId) % > ("class" -> nodeClass) > } > def *buildCategoryRows*: NodeSeq = { > val resourceData = Category.categoriesTreeList > (empty /: resourceData)((l, r) => l ++ *makeCategoryRow*(r)) > } > *buildCategoryRows* > } > > //it's a button for create competence > def *addCompetenceB*(xhtml: NodeSeq): NodeSeq = doCompetenceB(xhtml,"add > Competence",null) > //a button for create or edit competence > def *doCompetenceB*(xhtml: NodeSeq,msg: String,competence: Competence): > NodeSeq = { > a(() => { > *//here I try to get the categoryId if it selected.* > val catId: Long = _categoryId.is > S.runTemplate(List("competence","_competence")). > map(ns => > ModalDialog(doCompetenceEditor(ns,catId,competence))) openOr > Alert("Couldn't find _competence template")}, > Text(msg),"class" -> "button" > ) > } > > > > > On Tue, Dec 8, 2009 at 11:02 AM, Ross Mellgren <dri...@gmail.com> wrote: > >> Well if you logically expected it to be read but it wasn't, it might >> indicate a bug to you or help in diagnosis. >> >> I'm not sure I understand your reply fully -- when you added myId.is did >> the log message go away? If not, could you post your code? >> >> -Ross >> >> On Dec 7, 2009, at 9:39 PM, Xuefeng Wu wrote: >> >> I use myId.is but get nothing. >> I don't know what I could do with the information. >> >> On Tue, Dec 8, 2009 at 10:19 AM, Ross Mellgren <dri...@gmail.com> wrote: >> >>> I think that message is just informative, letting you know that you don't >>> seem to be using the request var fully (perhaps due to typo, or code >>> refactoring that made it unused, or something.) >>> >>> I think it'll go away if you access the variable somewhere using myId.is >>> . >>> >>> -Ross >>> >>> On Dec 7, 2009, at 9:02 PM, Xuefeng Wu wrote: >>> >>> Hi , >>> >>> When I use RequestVar get the message: RequestVar ....... was set but not >>> read >>> >>> My code like this: >>> object MyMgr { >>> ... >>> Loc.Snippet("myFoo",myFoo) >>> ... >>> object myId extends RequestVar[Long](0) >>> >>> def myFoo(xhtml: NodeSeq): NodeSeq = { >>> .... >>> def selectNode = { >>> >>> myId .set(vId) >>> >>> } >>> .... >>> bind("",xhtml, >>> "node"->a(() => selectNode, Text(nodeName)) >>> ) >>> } >>> >>> } >>> >>> the RequestVar must be used at Class? >>> >>> On Sat, Nov 21, 2009 at 12: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 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<liftweb%2bunsubscr...@googlegroups.com> >>>> . >>>> For more options, visit this group at >>>> http://groups.google.com/group/liftweb?hl=. >>>> >>>> >>>> >>> >>> >>> -- >>> Scala中文社区: http://groups.google.com/group/scalacn >>> >>> -- >>> 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=en. >>> >>> >>> >>> -- >>> 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=en. >>> >> >> >> >> -- >> Scala中文社区: http://groups.google.com/group/scalacn >> >> -- >> 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=en. >> >> >> >> -- >> 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=en. >> > > > > -- > Scala中文社区: http://groups.google.com/group/scalacn > > -- > 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=en. > > > -- > 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=en. > -- Scala中文社区: http://groups.google.com/group/scalacn -- 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=en.