2017-07-06 136 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看到你的數組就像你剛剛放入它包含的單個字符串而不是數組一樣。如果您嘗試使用多個元素的數組,您將遇到麻煩。