【问题标题】:OctoberCMS. Variable disappears after ajax request十月CMS。 ajax请求后变量消失
【发布时间】:2018-01-11 03:55:44
【问题描述】:

我的组件模板代码:

default.htm:

<div id="filter_variations" style="//display: none;">
{{ form_ajax('onAjaxVariations') }}
    <input type="text" id="var_id" name="Filter[id]" value="">
    <input type="submit">
{{ form_close() }}
</div>
<div id="partial_service">
    {% partial __SELF__ ~ '::service' %}
</div>

部分我尝试显示“服务”变量和动态“变量”变量:

<h1>{{service.name}}</h1>
<span>Selected variation: variation[0].name</span>

它可以工作

组件: 但如果我发出 ajax 请求,变量“服务”不会部分显示。为什么会这样?以及如何避免这种情况?

【问题讨论】:

    标签: octobercms


    【解决方案1】:

    Ajax 处理程序的工作方式与 10 月份的 page life cycle 不同。

    因此,当您调用页面时,它会 initialize page 包含所有数据和所有组件及其 life-cycle 方法。

    简而言之,ajax 请求中没有初始化所有数据

    您希望 service 对象位于部分内部,因此您正在使用

    $this->page['service']
    

    但它没有被初始化,所以它在 ajax 中不可用,

    要使其在页面code section 中可用,您需要使用onInit 方法。

    function onInit() {
        $this['service'] = // your logic to get service and assign it;
    }
    

    现在 service 将在您的 ajax 处理程序中可用

    公共函数 onAjaxVariations() { // $this->page['service'] 将可用,现在可以传递给视图; }

    在正常页面刷新时它可以工作,因为所有 page-cycle function executes、所有 component life-cycle 函数都已执行,因此 $this-&gt;page['service'] 将在此处可用。

    所有component life-cycle 函数表示您的onRender 函数=> 调用prepareVars => 分配$this-&gt;page['service']这东西不是在ajax调用中执行

    { 更新首选解决方案 }

    如果你的代码依赖于页面代码(页面生命周期)

    简而言之,代码写在页面markupcode section 中,您想先执行它

    在您的 ajax 处理程序方法中,您可以使用它

    $this->controller->pageCycle();
    

    它将自动执行所有页面代码,并且您的 all 变量现在可用。

    public function onAjaxVariations() {
        $this->controller->pageCycle();
        // $this->page['service'] will be available
    } 
    

    【讨论】:

    • 我添加了:public $service;公共函数 onInit() { $this->service = $this->page['service']; } 并定义变量: public function onAjaxVariations() { $this->page['variations'] = $this->getVariations(); $this->page['service'] = $this->service; return ['#partial_service' => $this->renderPartial('Variations::service') ]; } 但变量为空 =(
    • onInit 必须在页面的code section 中,而不是在组件内
    • 在标记中我设置了这样的变量:{% set service = builderDetails.record %} 如何在代码中执行此操作?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2019-01-13
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多