【问题标题】:OctoberCMS Javascript API AJAX call to a component function to update component's partialOctoberCMS Javascript API AJAX 调用组件函数以更新组件的部分
【发布时间】:2019-04-12 15:35:12
【问题描述】:

所以我有以下文件结构:

plugins/myname/pluginname/components/pluginname/default.htm
plugins/myname/pluginname/components/PluginName.php

default.htm 充当组件的一部分。 我有以下 JS API

setInterval(function(){
    $.request('onEverySecond', {
        update: {'@default.htm':'#rate-marquee'},
        complete: function() {
            console.log('Finished!');
        }
    })
}, 1000);

onEverySecondPluginName.php 中的一个函数,它将一个名为fx 的变量更新为default.htm

在前端,部分default.htm 似乎已更新,但它刷新了整个部分,这不是我想要的,它导致选框一次又一次地重播,只能显示前几块内容。 我想要的只是 AJAX 将只更新数据更新的变量fx

我怎样才能做到这一点?

编辑1:

这里是部分标记:

{% set fx = __SELF__.fx %}
<marquee id="rate-marquee" name="rate-marquee" onmouseover="this.stop();" onmouseout="this.start();">
    <ul>
        {% for item in fx %}
            <li>
            {{ item.Item | trim('u')}}: {{ item.BID }} {% if item.Revalue == 0 %} <div class="arrow-up"></div> {% else %} <div class="arrow-down"></div> {% endif %}
            </li>
        {% endfor %}
    </ul>
</marquee>

另外,这里是 PluginName.php 中的代码

public function onRun()
{
    $this->addJs('/plugins/SoyeggWebDevelopment/fxmarquee/assets/js/default.js');
    $this->updateFX();
}


public function onEverySecond()
{
    $this->updateFX();
}

public $fx;

所以 updateFX() 也可以很好地工作。

【问题讨论】:

  • 你能分享部分标记和fx使用的变量吗?
  • @HardikSatasiya 感谢您的回复。在选取框刷新时,该变量每秒都会完美更新。然而,整个选取框每次都会刷新,因此选取框会一次又一次地重新启动循环。我更新了标记,请看一下,谢谢!

标签: javascript ajax octobercms


【解决方案1】:

这里的问题似乎你正在替换 whole marquee 它导致重新渲染它。

为了解决这个问题,我们可以更新marquee中的部分

setInterval(function(){
    $.request('onEverySecond', {        
        complete: function() {
            console.log('Finished!');
        }
    })
}, 1000);

我们在这里没有做任何特别的事情,只是一个简单的ajax call

要更新marquee 的部分,我们需要assign id to it 并定义内部部分

<marquee id="rate-marquee" 
         name="rate-marquee" 
         onmouseover="this.stop();" onmouseout="this.start();">
    <ul id='rate-marquee-inner'> <!-- <= here -->
      {% partial __SELF__ ~ '::_marquee_inner' %}        
    </ul>
</marquee>

_marquee_inner.htmpartila 标记

{% set fx = __SELF__.fx %}
{% for item in fx %}
    <li>
    {{ item.Item | trim('u')}}: {{ item.BID }} {% if item.Revalue == 0 %} <div class="arrow-up"></div> {% else %} <div class="arrow-down"></div> {% endif %}
    </li>
{% endfor %}

要更新那部分,我们只需要返回标记数组

function onEverySecond() {
    $this->updateFX();
    return ['#rate-marquee-inner' => $this->renderPartial('_marquee_inner.htm')];
}

这将只是 push new updated markup 到给定的 id #rate-marquee-inner 所以现在它将 just update inner portion of marqueemarquee 不会重新渲染。

如有任何疑问,请发表评论。

【讨论】:

  • 谢谢哈迪克,现在它返回错误The partial '_marquee_inner.htm' is not found. 显示错误发生在default.htm,所以不知何故{% partial __SELF__ ~ '::_marquee_inner' %} 没有读取我已经创建的部分。看不到任何错别字
  • 我想通了。代码中有一些更改:不能使用return ['#rate-marquee-inner' =&gt; $this-&gt;renderPartial('_marquee_inner.htm')]; 结果只显示_marquee_inner.htm 中的代码,甚至没有布局。它还需要在 htm 之前使用@ 来引用组件的部分。其次,我删除了上面提到的行并在js中进行更新,所以它只更新ulupdate: {'@_marquee_inner.htm':'#rate-marquee-inner'},
猜你喜欢
  • 2018-04-12
  • 2017-10-18
  • 1970-01-01
  • 2016-10-17
  • 1970-01-01
  • 2017-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多