文章目录
- AJAX API
-
- Data attributes API
-
- Data attributes API
- 用法
- JavaScript API
-
- JavaScript API
- 用法
- 全局 AJAX 事件
- 例子
- extras 额外后缀功能
-
- Loading indicator 加载指示器
- 表单验证
-
- 抛出验证错误
- 展示error信息
- 字段展示error
- 加载button
- flash信息
- 用法
AJAX API
Data attributes API
Data attributes API
属性 | 描述 |
---|---|
data-request | 指定AJAX要调用的方法 |
data-request-confirm | 指定确认消息。在发送请求之前显示确认。如果用户单击“取消”按钮,则不会发送请求。 |
data-request-redirect | 指定在成功AJAX请求之后重定向浏览器的URL。 |
data-request-url | 指定将请求发送到的URL。默认值:window.location.href |
data-request-update | 指定要更新的partial和页面元素(CSS选择器)的列表。格式为partial: selector, partial: selector. 在某些情况下需要使用引号,如:‘my-partial’: ‘#myelement’. 注意@和^的用法 |
data-request-ajax-global | 默认为false。设置为true可全局启用jQuery ajax事件:ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess和ajaxSend。 |
data-request-data | 指定要发送到服务器的其他POST参数。格式如下 var: value, var: value.如果用引号的话 格式为 var: ‘some string’ 该属性可以在触发元素上使用,例如在也具有data-request属性的按钮上,在触发元素的最接近元素或父表单元素上使用。该框架合并了data-request-data属性的值 如果不同元素上的属性使用相同的名称定义参数,则框架将使用以下优先级:触发元素data-request-data,较近的父元素data-request-data,表单输入数据。 |
data-request-before-update | 指定要在页面内容更新之前直接执行的JavaScript代码。在JavaScript代码中,您可以访问以下变量:this(触发请求的元素),context对象,从服务器接收的data,textStatus 文本,jqXHR对象 |
data-request-success | this , context object , data object , textStatus , jqXHR object. |
data-request-error | this , context object , textStatus , jqXHR object. |
data-request-complete | 指定在请求成功完成或遇到错误时要执行的JavaScript代码。可访问变量为:this(触发请求的元素),context对象,textStatus 文本,jqXHR对象 |
data-request-loading | 为请求运行时要显示的元素指定CSS选择器。您可以使用此选项显示AJAX加载指示器。该功能使用jQuery的show()和hide()函数来管理元素的可见性。 |
data-request-form | 显式指定一个表单元素以用于获取表单数据。如果未指定,则使用最接近触发元素的表单,包括元素本身是一个表单。 |
data-request-flash | 指定后,此选项将指示服务器清除并发送带有响应的所有Flash消息。本选项也用在extra features中 |
data-request-files | 指定请求文件时,请求将接受文件上传,这需要浏览器提供FormData接口支持。 |
data-track-input | 可以应用于还具有data-request属性的文本,数字或密码输入字段。定义后,当用户在字段中输入内容时,输入字段会自动发送AJAX请求。 可选属性值可以定义框架在发送请求之前会等待多久间隔(以毫秒为单位) |
当为元素指定data-request属性时,当用户与其交互时,该元素会触发AJAX请求。根据元素的类型,以下事件将触发请求:
元素 | 事件 |
---|---|
Forms | 表单发送时 |
Links, buttons | 点击时 |
Text, number, and password fields | 当文本更改时,并且仅当出现了data-track-input属性时 |
Dropdowns, checkboxes, radios | 元素被选择时 |
用法
提交表单时调用onCalculate方法。用名为‘calcresult’的partial更新标识符为“ result”`的元素:
<form data-request="onCalculate" data-request-update="calcresult: '#result'">
发送请求之前,单击“删除”按钮,请求确认:
<form ... >...<button data-request="onDelete" data-request-confirm="Are you sure?">Delete</button>
成功请求后,重定向到另一个页面:
<form data-request="onLogin" data-request-redirect="/admin">
成功请求后显示一个弹出窗口:
<form data-request="onLogin" data-request-success="alert('Yay!')">
发送带参POST:
在多个元素之间发送带参post:
<div data-request-data="id: 7"><button data-request="onDelete">Delete</button><button data-request="onSave">Update</button>
</div>
文件上传
<form data-request="onSubmit" data-request-files><input type="file" name="photo" accept="image/*" /><button type="submit">Submit</button>
</form>
JavaScript API
JavaScript API
JavaScript API比数据属性API更强大。 request方法可以与表单内部或表单元素上的任何元素一起使用。当该方法与表单内的元素一起使用时,它将被转发到表单。
request方法具有一个必填参数-AJAX处理程序名称。例:
<form onsubmit="$(this).request('onProcess'); return false;">...
request方法的第二个参数是options对象。您可以使用与jQuery AJAX函数兼容的任何选项和方法。以下选项特定于十月框架:
属性 | 描述 |
---|---|
update | 一个对象,指定要更新的partial列表和页面元素(作为CSS选择器):{‘partial’:’#select’}。如果前面是@select,那就是插入partial 而不是覆写 |
confirm | 确认字符串。如果设置,则确认在发送请求之前显示。如果用户单击“取消”按钮,则请求将取消。 |
data | 一个可选对象,用于指定要与表单数据一起发送到服务器的数据:{var:‘value’}。 |
redirect | 字符串,指定成功请求后将浏览器重定向到的URL。 |
beforeUpdate | 在页面元素更新之前执行的回调函数。 函数获取3个参数:从服务器接收的数据对象,文本状态字符串和jqXHR对象。函数内部的this变量解析为请求内容一个包含两个属性的object-----handler 和 options代表最初的request()参数。 |
success | 一旦成功,执行回调,指定AJAX要调用的方法。如果提供此选项,它将覆盖默认框架的功能:不更新元素,不触发beforeUpdate事件,不触发ajaxUpdate和ajaxUpdateComplete事件。事件处理程序获取3个参数:从服务器接收的数据对象,文本状态字符串和jqXHR对象。但是,您仍然可以调用默认框架功能,在函数内部调用this.success(…) |
error | 发生错误时执行回调函数。默认情况下,显示警报消息。如果覆盖此选项,则不会显示警报消息。处理程序获取3个参数:jqXHR对象,文本状态字符串和错误对象-请参见jQuery AJAX函数。 |
complete | 一个表单元素,用于获取与请求一起发送的表单数据,可以作为选择器字符串或表单元素传递 |
flash | 如果为true,则指示服务器清除并发送带有响应的所有Flash消息。默认值:false |
form | 一个表单元素,用于获取与请求一起发送的表单数据,可以作为选择器字符串或表单元素传递。 |
files | 如果为true,则请求将接受文件上传,这需要浏览器提供FormData接口支持。默认值:false |
loading | 运行请求时要显示的可选字符串或对象。该字符串应为元素的CSS选择器,该对象应支持show()和hide()函数来管理可见性。您可以在使用框架额外功能时传递全局对象$ .oc.stripeLoadIndicator。 |
您还可以通过传递新fuction作为option来覆盖某些request逻辑。以下这些是可用的
方法 | 描述 |
---|---|
handleConfirmMessage(message) | 请求用户确认时调用。 |
handleErrorMessage(message) | 显示错误消息时调用。 |
handleValidationMessage(message, fields) | 使用验证时,将焦点放在第一个无效字段上。 |
handleFlashMessage(message, type) | 使用Flash选项提供Flash消息时调用(见上文)。 |
handleRedirectResponse(url) | 浏览器将重定向到另一个位置时调用。 |
用法
在发送onDelete请求之前,请请求确认:
$('form').request('onDelete', {confirm: 'Are you sure?',redirect: '/dashboard'
})
运行onCalculate处理程序,并将呈现的calcresult partial与result CSS类一起注入到page元素中:
$('form').request('onCalculate', {update: {calcresult: '.result'}
})
带参运行onCalculate
$('form').request('onCalculate', {data: {value: 55}})
刷新页面前调用beforeUpdate
$('form').request('onCalculate', {update: {calcresult: '.result'},beforeUpdate: function() { /* do something */ }
})
调用成功后 这么写
$('form').request('onCalculate', {success: function(data) {//... do something ...this.success(data);
}})
没有表单元素时 js写法:
$.request('onCalculate', {success: function() {console.log('Finished!');}
})
成功function完成后 调用一个回调
$('form').request('onCalculate', {success: function(data) {this.success(data).done(function() {//... do something after parent success() is finished ...});
}})
全局 AJAX 事件
AJAX框架在update,trigger,form和windows对象上装载了多个钩子。
无论使用哪个API(数据属性API或JavaScript API),都会触发钩子。
方法 | 描述 |
---|---|
ajaxBeforeSend | 在发送请求之前在window对象上触发。 |
ajaxBeforeUpdate | 在请求完成之后但在页面更新之前,直接在表单对象上触发。处理程序获取5个参数:event对象, context object, the data object 服务器传回的data对象, 状态文本值, 和jqXHR对象 |
ajaxUpdate | 在使用框架更新后在页面元素上触发。处理程序获取5个参数:event对象, context object, the data object 服务器传回的data对象, 状态文本值, 和jqXHR对象 |
ajaxUpdateComplete | 框架更新所有元素后,在window对象上触发。处理程序获取5个参数:event对象, context object, the data object 服务器传回的data对象, 状态文本值, 和jqXHR对象 |
ajaxSuccess | 成功完成请求后,在表单对象上触发。处理程序获取5个参数:event对象, context object, the data object 服务器传回的data对象, 状态文本值, 和jqXHR对象 |
ajaxError | 如果请求遇到错误,则在表单对象上触发。 处理程序获取5个参数:event对象, context object, error信息, 状态文本值, 和jqXHR对象 |
ajaxErrorMessage | 如果请求遇到错误,则在窗口对象上触发。处理程序获取2个参数:事件对象和从服务器返回的错误消息 |
ajaxConfirmMessage | 当给出确认选项时,在窗口对象上触发。处理程序获得2个参数:事件对象和作为confirm选项的一部分分配给方法的文本消息。这对于实现自定义确认逻辑/接口而不是本机javascript确认框很有用。 |
以下事件在触发元素上触发:
方法 | 描述 |
---|---|
ajaxSetup | 在形成请求之前触发,从而允许通过context.options对象修改option。 |
ajaxPromise | 在AJAX请求发送之前直接触发。 |
ajaxFail | 如果AJAX请求失败,则最终触发。 |
ajaxDone | 如果AJAX请求成功,则最终触发。 |
ajaxAlways | 无论AJAX请求失败还是成功都触发。 |
例子
在元素上触发ajaxUpdate事件时执行JavaScript代码。
$('.calcresult').on('ajaxUpdate', function() {console.log('Updated!');
})
使用逻辑处理程序执行显示Flash消息的单个请求。
$.request('onDoSomething', {flash: 1,handleFlashMessage: function(message, type) {$.oc.flashMsg({ text: message, class: type })}
})
将配置全局应用于所有AJAX请求。
$(document).on('ajaxSetup', function(event, context) {// Enable AJAX handling of Flash messages on all AJAX requestscontext.options.flash = true// Enable the StripeLoadIndicator on all AJAX requestscontext.options.loading = $.oc.stripeLoadIndicator// Handle Error Messages by triggering a flashMsg of type errorcontext.options.handleErrorMessage = function(message) {$.oc.flashMsg({ text: message, class: 'error' })}// Handle Flash Messages by triggering a flashMsg of the message typecontext.options.handleFlashMessage = function(message, type) {$.oc.flashMsg({ text: message, class: type })}
})
extras 额外后缀功能
使用AJAX框架时,可以选择指定Extras后缀,其中包括其他StyleSheet和JavaScript文件。当在前端CMS页面中使用AJAX请求时,这些功能很有用。
{% framework extras %}
Loading indicator 加载指示器
你应该注意到的第一个功能是运行AJAX请求时显示在页面顶部的加载指示器。该指标与AJAX框架使用的全局事件挂钩。
当AJAX请求启动时,将触发ajaxPromise事件,该事件显示加载指示器并将鼠标光标变为加载状态。
ajaxFail和ajaxDone事件用于检测请求何时完成,指示符在哪里再次隐藏。
表单验证
您可以在表单上指定data-request-validate属性以启用验证功能。
<formdata-request="onSubmit"data-request-validate><!-- ... -->
</form>
抛出验证错误
服务器端AJAX处理程序中,您可以使用ValidationException类抛出验证异常,以使字段无效,其中第一个参数是数组。
数组应使用字段名称作为键,并使用错误消息作为值。
function onSubmit()
{throw new ValidationException(['name' => 'You must give a name!']);
}
注意:您还可以将验证服务(validation service)的实例作为异常的第一个参数传递。
展示error信息
在表单内部,可以使用容器元素上的data-validate-error属性显示第一条错误消息。容器内的内容将被设置为错误消息,并且该元素将变为可见。
<div data-validate-error></div>
要显示多个错误消息,请包含一个具有data-message属性的元素。
在此示例中,段落标签将被复制并为存在的每条消息设置内容。
<div class="alert alert-danger" data-validate-error><p data-message></p>
</div>
要在AJAX失效上添加自定义类,请钩住ajaxInvalidField和ajaxPromise JS事件
$(window).on('ajaxInvalidField', function(event, fieldElement, fieldName, errorMsg, isFirst) {$(fieldElement).closest('.form-group').addClass('has-error');
});$(document).on('ajaxPromise', '[data-request]', function() {$(this).closest('form').find('.form-group.has-error').removeClass('has-error');
});
字段展示error
另外,您可以通过定义使用data-validate-for属性的元素(将字段名称作为值传递)来显示各个字段的验证消息。
<!-- Input field -->
<input name="phone" /><!-- Validation message for the field -->
<div data-validate-for="phone"></div>
如果该元素保留为空,则将使用服务器中的验证文本填充该元素。否则,您可以指定您喜欢的任何文本,它将改为显示。
<div data-validate-for="phone">Oops.. phone number is invalid!
</div>
加载button
当任何元素包含data-attach-loading属性时,将在AJAX请求期间将CSS类oc-loading添加到该元素。此类使用:after在按钮和锚点元素上生成小加载图标。
<form data-request="onSubmit"><button data-attach-loading>Submit</button>
</form><ahref="#"data-request="onDoSomething"data-attach-loading>Do something
</a>
flash信息
在表单上指定data-request-flash属性,以在成功的AJAX请求中启用Flash消息。
<formdata-request="onSuccess"data-request-flash><!-- ... -->
</form>
结合事件处理程序中Flash外观的使用,请求完成后将显示一条Flash消息。
function onSuccess()
{Flash::success('You did it!');
}
为了与基于AJAX的Flash消息保持一致,可以通过在页面或布局中放置此代码来在页面加载时呈现标准flash信息 standard flash message。
{% flash %}<pdata-control="flash-message"class="flash-message fade {
{ type }}"data-interval="5">{
{ message }}</p>
{% endflash %}
用法
以下是表单验证的完整示例。它调用onDoSomething事件处理程序,该事件处理程序将触发加载提交按钮,对表单字段执行验证,然后显示成功的Flash消息。
<formdata-request="onDoSomething"data-request-validatedata-request-flash><div><input name="name" /><span data-validate-for="name"></span></div><div><input name="email" /><span data-validate-for="email"></span></div><button data-attach-loading>Submit</button><div class="alert alert-danger" data-validate-error><p data-message></p></div></form>
AJAX事件处理程序查看客户端发送的POST数据,并将一些规则应用于验证器。如果验证失败,则抛出ValidationException,否则返回Flash :: success消息。
function onDoSomething()
{$data = post();$rules = ['name' => 'required','email' => 'required|email',];$validation = Validator::make($data, $rules);if ($validation->fails()) {throw new ValidationException($validation);}Flash::success('Jobs done!');
}