What do you mean by dispatch? This is all taking place inside one screen, just 
parts of the screen each change between one set of xhtml and another. It would 
be overkill to split the view into separate files -- the html file has about 60 
lines (not counting some that are commented out :) ).
Another use case might be a tabbed dialog that's not so complex that it's worth 
it to put each page in a separate template, or a button that changes between a 
simpler set of configuration controls and a more advanced set. I prefer to use 
templates etc. for something that's used in more than one place.
Thanks.


-------------------------------------
David Pollak<feeder.of.the.be...@gmail.com> wrote:

I think you're approaching the issue backwards... I'd figure out if you have
a client first and dispatch based on that... I'll work on some code late
morning tomorrow (Monday) for you.

On Thu, Aug 6, 2009 at 9:28 AM, Naftoli Gugenheim <naftoli...@gmail.com>wrote:

> Here's some view xhtml:
>>
>>  <req:noClient>
>
>  <label for="clientquery">Client </label>
>
>  <client:query id="clientquery" size="5"/>
>
>  <client:set />
>
>  </req:noClient>
>
>  <req:client>
>
>  Client <client:unset />
>
>  <client:edit><client:name /></client:edit><br />
>
>  <client:details />
>
>  </req:client>
>
>  <hr />
>
>
> And here's some snippet code:
>
>>     xhtml.bind("req",
>
>       "noClient" -> noClient _,
>
>       "client" -> hasClient _,
>
>       ...
>
>     )
>
>     def noClient(xhtml: NodeSeq) = {
>
>       var clientQuery: String = ""
>
>       def queryClient {
>
>          ...
>
>       }
>
>       client match {
>
>         case None =>
>
>           xhtml.bind("client",
>
>             "query" -> keepAttrs(SHtml.text(clientQuery, clientQuery = _)),
>
>             "set" -> SHtml.submit(?(">"), ()=>queryClient)
>
>           )
>
>         case Some(_) =>
>
>           NodeSeq.Empty
>
>       }
>
>     }
>
>
> So both alternatives are always bound to a NodeSeq=>NodeSeq function, and
> both functions have to check if client is None or a Some, and always one
> function returns NodeSeq.Empty and the other one something useful.
> So my question is not, "how can I do xxx," but, "is there a 'DRY'er or more
> concise way to do it."
> In another place I used a slightly different technique:
>
>> val emptyFn = (ns: NodeSeq) => NodeSeq.Empty
>
> def noLocationKind = (ns: NodeSeq) => ...
>
> def hasLocationKind(kind: LocKind#Value) = (ns:NodeSeq) => ...
>
> ns.bind("nlt",
>
> //            "name" -> {(ns:NodeSeq)=>Text("foo")},
>
>             "locKind" -> lkOpt.map(hasLocationKind).getOrElse(emptyFn),
>
>             "noLocKind" -> (if(lkOpt==None) noLocationKind else emptyFn)
>
> ).bind("nlt","name"->nlt.name.is)
>
> Where lkOpt is the value that can be None or a Some. Instead of letting the
> functions check None/Some, I check outside the function. But it still seems
> that in theory it could be simplified.
> chooseTemplate doesn't solve the problem that the alternative NodeSeq has
> to be transformed to NodeSeq.Empty.
> P.S. Notice that I'm using my implicit to call bind on the NodeSeq :)
> P.P.S If you look closely, there's another problem that I had. For some
> reason the first "name" -> ... was getting ignored, and it only worked in
> the second bind.
> Thanks!
>
>
>
>
>
> On Thu, Aug 6, 2009 at 10:49 AM, David Pollak <
> feeder.of.the.be...@gmail.com> wrote:
>
>> I really need to see the resulting view code that you'd like to see
>> depending on the conditions.
>>
>> On Thu, Aug 6, 2009 at 7:47 AM, Naftoli Gugenheim 
>> <naftoli...@gmail.com>wrote:
>>
>>>
>>> No, I meant that this pattern of parts of the view being alternatives to
>>> each other repeats, in other words the view has several pairs of
>>> alternatives.
>>
>>
>> I don't understand why the example doesn't allow for alternatives that
>> repeat.
>>
>>
>>>
>>>
>>> -------------------------------------
>>> David Pollak<feeder.of.the.be...@gmail.com> wrote:
>>>
>>> On Wed, Aug 5, 2009 at 8:44 PM, Naftoli Gugenheim <naftoli...@gmail.com
>>> >wrote:
>>>
>>> >
>>> > What's the smartest / most concise way to achieve the following in the
>>> > corresponding view xhtml and snippet code:
>>> > Parts of the view have to change, depending on whether something is
>>> set.
>>> > For example, in the area where you select the client, if the client is
>>> None,
>>> > then it displays an interface to select a client. If it's set to a Some
>>> then
>>> > it displays the client's details with a button to unset it. This
>>> pattern is
>>> > repeated.
>>> > My current strategy is to have two elements, req:noClient and
>>> req:client,
>>> > which have different xhtml contents. Then in the snippet I bind them to
>>> two
>>> > NodeSeq functions, one that binds useful contents when the client is
>>> None
>>> > and returns NodeSeq.Empty otherwise; and another function that binds
>>> when
>>> > it's a Some and returns Empty otherwise. However, it seems to be
>>> somewhat
>>> > redundant in theory.
>>> > So does anyone have a better way of switching view parts?
>>>
>>>
>>> If it's repeated, then <lift:embed /> the part that you need.
>>>
>>> <lift:MaybeClient>
>>>  <client:yes><lift:embed
>>> what="/templates/client_edit.html"/></client:yes>
>>>  <client:no><lift:embed
>>> what="/templates/client_chooser.html"/><client:no>
>>> </lift:MaybeClient>
>>>
>>>
>>>
>>> >
>>> > Thanks.
>>> >
>>> >
>>> >
>>> > >
>>> >
>>>
>>>
>>> --
>>> Lift, the simply functional web framework http://liftweb.net
>>> Beginning Scala http://www.apress.com/book/view/1430219890
>>> Follow me: http://twitter.com/dpp
>>> Git some: http://github.com/dpp
>>>
>>>
>>>
>>>
>>>
>>
>>
>> --
>> Lift, the simply functional web framework http://liftweb.net
>> Beginning Scala http://www.apress.com/book/view/1430219890
>> Follow me: http://twitter.com/dpp
>> Git some: http://github.com/dpp
>>
>>
>>
>
> >
>


-- 
Lift, the simply functional web framework http://liftweb.net
Beginning Scala http://www.apress.com/book/view/1430219890
Follow me: http://twitter.com/dpp
Git some: http://github.com/dpp



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"Lift" group.
To post to this group, send email to liftweb@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
-~----------~----~----~----~------~----~------~--~---

Reply via email to