Javascript swatchRenderer.js中的Magento 2错误

Javascript swatchRenderer.js中的Magento 2错误,javascript,magento2,Javascript,Magento2,我已经覆盖了app\code\Mydirectory\CustomSwatches\view\frontend\web\js\SwatchRenderer.js中的magentoSwatchRenderer.js文件 我的问题是我的产品页面加载出错: 未捕获的TypeError:无法读取未定义的属性“updateData” 我发现SwatchRenderer.js上的data('gallery')的以下函数未定义 updateBaseImage: function (images, contex

我已经覆盖了
app\code\Mydirectory\CustomSwatches\view\frontend\web\js\SwatchRenderer.js
中的magento
SwatchRenderer.js文件

我的问题是我的产品页面加载出错:

未捕获的TypeError:无法读取未定义的属性“updateData”

我发现
SwatchRenderer.js
上的
data('gallery')
的以下函数未定义

updateBaseImage: function (images, context, isProductViewExist) {
        var justAnImage = images[0];

        if (isProductViewExist) {
            context
                .find('[data-gallery-role=gallery-placeholder]')
                .data('gallery')
                .updateData(images);
        } else if (justAnImage && justAnImage.img) {
            context.find('.product-image-photo').attr('src', justAnImage.img);
        }
    }

我查看了一个Magento 2演示站点。在该站点上,上述数据属性设置为JavaScript对象。目标元素是具有上述属性的div。但在我的站点中,它是未定义的,显然我认为我的站点上没有设置数据属性。有人能帮我找到上述元素的setter函数/视图/文件吗?任何帮助都将不胜感激。谢谢。

您的Magento实例中使用了什么主题?您是否重命名了容器类名称

在SwatchRenderer.js文件的第202行可以找到一段有趣的代码。在_create函数下,您将看到gallery变量的初始化,如图所示


您会注意到它在.column.main元素下找到了具有数据库的元素。因此,由于缺少列,main元素将返回一个空响应。

我找到了一个非常有效的方法来解决这个问题:

/vendor/magento/module-swatches/view/frontend/web/js/swatch-renderer.js
-文件复制到
app/design/YourName/YourTheme/magento\u-swatches/web/js/swatch-renderer.js
,并用以下代码替换
updateBaseImage()
(第1152行)中的代码:

updateBaseImage: function (images, context, isInProductView, eventName) {
    var gallery = context.find(this.options.mediaGallerySelector).data('gallery');

    if (eventName === undefined && gallery !== undefined) {
        this.processUpdateBaseImage(images, context, isInProductView, gallery);
    } else {
        context.find(this.options.mediaGallerySelector).on('gallery:loaded', function (loadedGallery) {
            loadedGallery = context.find(this.options.mediaGallerySelector).data('gallery');
            this.processUpdateBaseImage(images, context, isInProductView, loadedGallery);
        }.bind(this));
    }
},
诀窍在于:此方法不会等待库完全加载,而此事件(
gallery:loaded
)随时可用。通过将其添加到方法中,效果很好


我只希望Magento开发人员能够理解这一点,并在核心代码中实现这一点。

Magento实例中使用了什么主题?您是否重命名了容器类名称?自定义主题,不,我没有重命名容器类。它们在适当的地方。元素
[数据库角色=库占位符]
就在那里。但是它缺少
数据库
(不是
数据库角色
)属性。只需SwatchRenderer文件?产品视图页面的HTML代码。您还可以尝试在浏览器控制台上执行jQuery(“[data gallery role=gallery placeholder]”),以检查产品视图页面上是否存在所述元素。接下来,如果元素确实存在,请尝试执行jQuery(“[data gallery role=gallery placeholder]”,“.column.main”)。请将以上jQuery代码的结果发布给我,以便我向您的客户进一步解释解决方案problem@oliver我做了那些实验,但失败了<代码>
以上代码是我在Magento默认中的数据角色,我应该重命名它吗?