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

--~--~---------~--~----~------------~-------~--~----~
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