Magento 2在“ section-config.js”中存储切换器错误未捕获的TypeError:无法读取未定义(...)的属性'*'


12

我在自定义主题中实现了自定义商店切换器。

块模板如下:

<?php if (count($block->getStores())>1): ?>
    <?php $id = $block->getIdModifier() ? '-' . $block->getIdModifier() : ''?>

    <span><?php echo $block->escapeHtml($block->getStoreName()) ?></span>

    <span>/</span>

    <?php foreach ($block->getStores() as $_lang): ?>
        <?php if ($_lang->getId() != $block->getCurrentStoreId()): ?>
            <span class="view-<?php echo $block->escapeHtml($_lang->getCode()); ?> switcher-option">
                <a href="#" data-post='<?php /* @escapeNotVerified */ echo $block->getTargetStorePostData($_lang); ?>'>
                    <?php echo $block->escapeHtml($_lang->getName()) ?>
                </a>
            </span>
        <?php endif; ?>
    <?php endforeach; ?>

<?php endif; ?>

正确显示了到新商店的链接,因此我认为xml内容还可以,但是单击时会收到以下错误:

section-config.js:33未捕获的TypeError:无法读取未定义(...)的属性'*'

生成html的内容如下所示:

<span class="view-it switcher-option">
  <a href="#" data-post="{"action":"http:\/\/test.mysite.eu\/stores\/store\/switch\/","data":{"___store":"it","uenc":"aHR0cDovL3Rlc3QuZnJhZ2lhY29tb21pbGFuby5ldS8,"}}">
    It
  </a>
</span>

您是否运行了deploy命令并删除了var文件夹?
Rakesh Jesadiya '16

不XD我会做并跟进
davideghz

sudo php bin/magento setup:static-content:deploy没有运气。为什么要删除var文件夹?我到底应该删除什么?
davideghz

您必须删除var文件夹的所有内容
Rakesh Jesadiya

1
@davideghz得到解决方案了吗?
Mohammad Mujassam

Answers:


14

我遇到了同样的问题,发现由于主题的自定义,这两个块不再被调用。

默认情况下,这两个块添加在<referenceContainer name="content">vendor / magento / module-customer / view / frontend / layout / default.xml中。

尝试在您的layout.xml中重新添加这些块:

<block name="customer.section.config" class="Magento\Customer\Block\SectionConfig"
    template="Magento_Customer::js/section-config.phtml"/>
<block name="customer.customer.data"
    class="Magento\Customer\Block\CustomerData"
    template="Magento_Customer::js/customer-data.phtml"/>

我有同样的问题,但块被渲染。我猜这是因为我在调用cart reload方法时处于requireJs方法中,但是在呈现块之前执行了JS。我可以依靠任何js模块来避免这种情况吗?
bpoiss '17

1
只是有这个完全相同的问题..而使用github.com/SnowdogApps/magento2-theme-blank-sass(Magento 2.2.6)。将以上两个块相加可解决此问题。谢谢
giolliano sulit

5

在我们的项目中,我们将其固定在section-config.js方法中的文件中getAffectedSections(这就是我们的错误所在)。
我们替换了最后一行:

return _.union(_.toArray(actions), _.toArray(sections['*']));

通过以下之一:

return (sections && sections.length > 0) ? _.union(_.toArray(actions), _.toArray(sections['*'])) : {};

当不影响任何部分时,实际上返回一个空数组。


您的解决方案运作良好吗?
贾里德·朱

1
是的,这是一个可行的解决方法,但是IIRC,我们问题的真正根源是最终稍微滥用了JS API。它并没有使此修复程序变得无关紧要,它仍然是确保代码在没有严重错误的情况下继续运行并且不会在此处停止的保护措施。
Flinth

1
谢谢,它正在工作..
拉维·索尼

它也为我工作。但是在某些类别中,当我更改商店视图时,更改商店视图后,我会得到无效的表单密钥。请刷新页面。不过没有表格。...我很困惑
GG

0

即使customer.section.configcustomer.customer.data已正确加载到页面中,也遇到相同的问题。

但在我的情况下却发生了,因为扩展尝试过早触发部分重新加载(在将section-config.js加载正确的配置之前)。

通过在getAffectedSectionssection-config.js中添加断点并检查url变量来解决该问题。然后将扩展JS移到customer.section.config块之后加载:

<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
    <body>
        <move element="extension.js.block" destination="content" after="customer.section.config"/> 
    </body>
</page>

0

在我们的例子中,这是默认模板中的一些代码,该模板在成功页面上调用了customer-data.js文件之后就将其加载。

我们找到文件: vendor/magento/module-checkout/view/frontend/templates/success.phtml

正在加载此代码:

<script>
    require([
        'Magento_Customer/js/customer-data'
    ], function (customerData) {
        var sections = ['cart'];
        customerData.invalidate(sections);
        customerData.reload(sections, true);
    });
</script>

删除此代码可以解决此问题,我们通过在主题模板目录中创建此文件的副本并删除有问题的代码段来解决此问题。

您可以使用Chrome开发者工具找出发生错误的位置,然后在本地开发人员的该文件中添加一个console.trace();调用,以建立正在调用该函数的函数,该函数会将错误抛出到控制台中。沿着链条到不正确地装载东西的地方。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.