事件处理器

AJAX 处理程序

AJAX 事件处理程序是可以在页面或布局中定义的 PHP 函数PHP 部分 或里面components.处理程序名称应具有以下模式:onName.所有处理程序都支持使用更新部分 作为 AJAX 请求的一部分。

function onSubmitContactForm()
{
    // ...
}

如果在页面和布局中同时定义了两个同名的处理程序,则将执行页面处理程序。中定义的处理程序components 具有最低的优先级。

调用处理程序

每个 AJAX 请求都应该指定一个处理程序名称,或者使用数据属性API 或者JavaScript API.发出请求时,服务器将搜索所有已注册的处理程序并找到它找到的第一个处理程序。

<!-- Attributes API -->
<button data-request="onSubmitContactForm">Go</button>

<!-- JavaScript API -->
<script> $.request('onSubmitContactForm') </script>

如果两个组件注册相同的处理程序名称,建议在处理程序前加上前缀组件简称或别名.如果组件使用别名mycomponent 处理程序可以作为目标mycomponent::onName.

<button data-request="mycomponent::onSubmitContactForm">Go</button>

您可能想使用__SELF__ 引用变量而不是硬编码别名,以防用户更改页面上使用的组件别名。

<form data-request="{{ __SELF__ }}::onCalculate" data-request-update="'{{ __SELF__ }}::calcresult': '#result'">

通用处理程序

有时您可能需要发出 AJAX 请求来更新页面内容,而不需要执行任何代码。您可以使用onAjax 为此目的的处理程序。该处理程序随处可用,无需编写任何代码。

<button data-request="onAjax">Do nothing</button>

AJAX 处理程序中的重定向

如果您需要将浏览器重定向到另一个位置,请返回Redirect 来自 AJAX 处理程序的对象。一旦从服务器返回响应,框架将重定向浏览器。 AJAX 处理程序示例:

function onRedirectMe()
{
    return Redirect::to('https://google.com');
}

从 AJAX 处理程序返回数据

在高级情况下,您可能希望从 AJAX 处理程序返回结构化数据。如果 AJAX 处理程序返回一个数组,您可以在success 事件处理程序。 AJAX 处理程序示例:

function onFetchDataFromServer()
{
    /* Some server-side code */

    return [
        'totalUsers' => 1000,
        'totalProjects' => 937
    ];
}

可以使用数据属性 API 获取数据:

<form data-request="onHandleForm" data-request-success="console.log(data)">

与 JavaScript API 相同:

<form
    onsubmit="$(this).request('onHandleForm', {
        success: function(data) {
            console.log(data);
        }
    }); return false;">

抛出 AJAX 异常

你可以扔一个AJAX 异常 使用AjaxException 类将响应视为错误,同时保留正常发送响应内容的能力。只需将响应内容作为异常的第一个参数传递。

throw new AjaxException([
    'error' => 'Not enough questions',
    'questionsNeeded' => 2
]);

NOTE:抛出这种异常类型时部分会更新 像平常一样。

在处理程序之前运行代码

有时您可能希望代码在处理程序执行之前执行。定义一个onInit 功能的一部分页面执行生命周期 允许代码在每个 AJAX 处理程序之前运行。

function onInit()
{
    // From a page or layout PHP code section
}

你可以定义一个init 里面的方法组件类 或者后端小部件类.

function init()
{
    // From a component or widget class
}
豫ICP备18041297号-2