Hello,

this almost works :).

Right now in my form I have a hidden element where the type of the operation to 
execute will be set:
<input type="hidden" id="operation_id" name="operation_id" value="" />
(the name is needed for jquery to set the value, and the id so that I can later 
read the value using S).

I bind the button as following:

"addElement" -> <button onclick={((JqId(Str("operation_id")) >> JqAttr("value", 
Str("add")))
              & SHtml.submitAjaxForm("elements_edit")).toJsCmd+" return 
false;"}>{Text("Add element")}</button>,

and add a hidden field to the whole form to do the processing:

bind(
...
)  ++ SHtml.hidden(() => {
      val operationId = S.param("operation_id")
      operationId.map { opId => opId match {
        case "add" => elements += new Element
        case _ => println("Unknown operation: " + opId)
      } }
      reDraw
    })

where elements is a RequestVar object.

However for some reason, when I click the button, in the callback I get a new 
elements RequestVar (so it's initialized to an initial value) and moreover, 
nothing gets redrawn on the page. What is also quite weird is that the 
RequestVar is re-initialized, but the snippet instance stays the same. Any 
ideas? :)

I thought that my use-case would be quite common in lift: I just want to add a 
couple of buttons to my form which execute different actions.

Thanks for the help!
Adam

On Jan 10, 2010, at 6:03 PM, Marius wrote:

> 
> Sorry I think the syntax would be (I haven't tested it though):
> 
> <button onclick={((JqId("hidden_field_id") >> JqAttr("value", "add"))
> & SHtml.submitAjaxForm(form_ID)).toJsCmd}>add</button>
> <button onclick={((JqId("hidden_field_id") >> JqAttr("value",
> "edit")) & SHtml.submitAjaxForm(form_ID)).toJsCmd}>edit</button>
> <button onclick={((JqId("hidden_field_id") >> JqAttr("value",
> "delete")) & SHtml.submitAjaxForm(form_ID)).toJsCmd}>delete</button>
> 
> Br's,
> Marius
> 
> On Jan 10, 6:58 pm, Marius <marius.dan...@gmail.com> wrote:
>> On Jan 10, 5:20 pm, Adam Warski <a...@warski.org> wrote:
>> 
>>> Hello,
>> 
>>>> ajaxButton("Press me would ya'?", SHtml.submitAjaxForm
>>>> (form_ID).toJsCmd, (some) => {
>> 
>>>> do your stuff here
>> 
>>>> })
>> 
>>> Looking at the source code I think this might work, but I'm having trouble 
>>> constructing the correct expression to pass to ajaxButton. The method 
>>> signature requires a Call instance, and SHtml.submitAjaxForm results in a 
>>> command (JsCmd). Is it possible to somehow combine the two?
>> 
>> I was referring to this signature:
>> 
>> def ajaxButton(text: NodeSeq, jsExp: JsExp, func: String => JsCmd,
>> attrs: (String, String)*): Elem
>> 
>> and not
>> 
>> def ajaxButton(text: NodeSeq, jsFunc: Call, func: () => JsCmd, attrs:
>> (String, String)*): Elem
>> 
>> jsExp will be called before sending the actual ajax. But this may be a
>> bit problematic if your jsExp sends the ajaxForm the ajax request is
>> processed asynchronously at js level meaning the the button ajax
>> request may be send before the actual ajax form processing is done.
>> I'm not sure if this fits your needs
>> 
>> 
>> 
>>> Or maybe there is some other, lift-idomatic way to solve my problem?
>>> I want to create a form with a list of elements, with three ajax buttons: 
>>> add, remove and save (adding/removing a row and persisting the list)
>> 
>> The first solution I described involving hidden fields will definitely
>> work. I don't think you need to do 2 ajax calls (one for the form and
>> one for the button) but piggy back the button information into a
>> hidden field and only submit the form:
>> 
>> Perhaps something like:
>> 
>> <button onclick={(JqId("hidden_field_id") >> JqAttr("value", "add")) +
>> + SHtml.submitAjaxForm(form_ID).toJsCmd}>blah</button>
>> 
>> 
>> 
>>> By the way, I think there's a small inconsistency; there are 7 overloaded 
>>> variants for ajaxButton:
>> 
>>> ajaxButton(text: NodeSeq, func: () => JsCmd, attrs: (String, String)*): Elem
>>> ajaxButton(text: String, func: () => JsCmd, attrs: (String, String)*): Elem
>> 
>>> ajaxButton(text: NodeSeq, jsFunc: Call, func: () => JsCmd, attrs: (String, 
>>> String)*): Elem
>>> ajaxButton(text: String, jsFunc: Call, func: () => JsCmd, attrs: (String, 
>>> String)*): Elem
>> 
>>> ajaxButton(text: NodeSeq, jsExp: JsExp, func: String => JsCmd, attrs: 
>>> (String, String)*): Elem
>> 
>>> and the last one doesn't have a text: String counterpart. Also the javadoc 
>>> for the last variant is missing information on what's "jsExp" and what's 
>>> the argument passed to "func". My guess would be that jsExp is evaluated 
>>> and the result passed to func on the server?
>> 
>> Yes jsExp is being evaluated and its result is being sent to server.
>> Please open a defect for this inconsistency.
>> 
>> 
>> 
>>> --
>>> Adam
> -- 
> 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.
For more options, visit this group at 
http://groups.google.com/group/liftweb?hl=en.


Reply via email to