2017-07-06 142 views
0

我的主要问题是使用require.js时,我的函数不再是Global。所以当我从我的phtml文件中调用它时,它并没有被发现。任何想法什么是在我的js文件全局内部生成一个函数的正确方法?我尝试了多种方法/我在网上找到的答案,但似乎没有任何工作。有什么建议么?Magento 2:如何调用js函数在我的Requirement.js文件中,从phtml文件

这里是我的js文件

define([ 
    'jquery' 
], function ($) { 

    return function (config) { 
    console.log(config); 
    } 

    function initMap() { 
    console.log('initMap is being called'); 
    } 
}); 

我requirejs-config.js文件:

var config = { 
    map: { 
     '*': { 
      'gslMap': ['Gauge_StoreLocator/js/app'] 
     } 
    } 
}; 

我PHTML文件:回调函数 “initMap” 被称为在结束

<script async defer src="https://maps.googleapis.com/maps/api/js?key=<?php echo $this->getGoogleApi(); ?>&callback=initMap"> 

回答

0

如果你必须使你的initMap功能全局的,你可以通过故意泄露其参与全球空间做到这一点:

define([ 
    'jquery' 
], function ($) { 

    return function (config) { 
    console.log(config); 
    } 

    function initMap() { 
    console.log('initMap is being called'); 
    } 

    // Deliberately leak initMap into the global space. 
    window.initMap = initMap; 
}); 

但请注意,在浏览器中使用时RequireJS始终异步操作。因此,如果您只是在某处放置script标签并希望获得最佳效果,您将遇到麻烦。如果它是通过代码动态添加的,那么首先使用initMap加载模块,那么你会好起来的。请注意0​​不带数组。另一方面,paths确实接受数组作为值,但我没有看到只有一个元素的数组点。 (数组旨在提供后备)。RequireJS不会因为您在map中给出的数组而大声失败的原因是,在JavaScript ["foo"].toString() === "foo"中,并且在处理map的值的代码中存在对.toString()的隐式调用,所以RequireJS看到你的数组就像你刚刚放入它包含的单个字符串而不是数组一样。如果您尝试使用多个元素的数组,您将遇到麻烦。