# remoteField

## Purpose

Creates a text field that sends its value to a remote link when it changes. By default the parameter name sent is called 'value', this can be changed by specifying a 'paramName' attribute.

## Examples

Example controller for an application called "shop":

    class BookController {
        def changeTitle = {
           def b = Book.get(params.id)
           b.title = params.value
           b.save()
        }
    }

Example usages for above controller:

    <g:remoteField action="changeTitle" update="titleDiv"  name="title" value="${book?.title}"/><div id="titleDiv">I'm updated with the new title!</div>

## Description

Attributes

- `name` (required) - the name of the field
- `value` (optional) - The initial value of the field
- `paramName` (optional) - The name of the parameter send to the server
- `action` (optional) - the name of the action to use in the link, if not specified the default action will be linked
- `controller` (optional) - the name of the controller to use in the link, if not specified the current controller will be linked
- `id` (optional) - The id to use in the link
- `update` (optional) - Either a map containing the elements to update for 'success' or 'failure' states, or a string with the element to update in which cause failure events would be ignored
- `before` (optional) - The javascript function to call before the remote function call
- `after` (optional) - The javascript function to call after the remote function call
- `asynchronous` (optional) - Whether to do the call asynchronously or not (defaults to true)
- `method` (optional) - The method to use the execute the call (defaults to "post")

Events

- `onSuccess` (optional) - The javascript function to call if successful
- `onFailure` (optional) - The javascript function to call if the call failed
- `on_ERROR_CODE` (optional) - The javascript function to call to handle specified error codes (eg on404="alert('not found!')")
- `onUninitialized` (optional) - The javascript function to call the a ajax engine failed to initialise
- `onLoading` (optional) - The javascript function to call when the remote function is loading the response
- `onLoaded` (optional) - The javascript function to call when the remote function is completed loading the response
- `onComplete` (optional) - The javascript function to call when the remote function is complete, including any updates

## Source

Show Source

    def remoteField = { attrs, body ->
    		def paramName = attrs.paramName ? attrs.remove('paramName') : 'value'
    		def value = attrs.remove('value')
    		if(!value) value = ''		out << "<input type=\"text\" name=\"${attrs.remove('name')}\" value=\"${value}\" onkeyup=\""        if(attrs.params) {
    			if(attrs.params instanceof Map) {
    				attrs.params.put(paramName, new JavascriptValue('this.value'))
    			}
    			else {
    				attrs.params += "+'${paramName}='+this.value"
    			}
    		}
    		else {
        		attrs.params = "'${paramName}='+this.value"
    		}
    		out << remoteFunction(attrs)
    		attrs.remove('params')
    		out << "\""
    		attrs.remove('url')
    		attrs.each { k,v->
    			out << " $k=\"$v\""
    		}
    		out <<" />"
    	}