1

我遇到的問題與RequireJS在那裏,我不能出口一組函數時,我有一個需要聲明。RequireJS - 導出設定功能

假設我有一個名爲mySubFile.js,其中,第一我需要注入jQuery的文件,然後又依賴。現在,我們假設我有myFunction,我想導出它以便從另一個文件中調用。

define('mySubFile', ['jquery'], function ($) { 
    require(['dependency1'], function (dependency1) { 

     let myFunction = function(){ return "Hey There"; } 

     return : { 
        myFunction : myFunction 
     } 

    }); 
}); 

現在讓我們假設,我想調用該函數從myFile.js

define('myFile', ['jquery'], function ($) { 
    require(['mySubFile'], function (mySubFile) { 

     console.log(mySubFile.myFunction()); 

    }); 
}); 

這是行不通的。我得到:

無法讀取未定義的屬性'myFunction'。

在另一邊,如果我定義mySubFile.js如下:

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

    let myFunction = function(){ return "Hey There"; } 

    return : { 
       myFunction : myFunction 
    } 

}); 

我可以訪問myFunction的,但我需要首先解決jQuery的

我努力尋找解決方案,但仍然沒有找到任何東西。

我該如何解決這個問題?

+0

你的意思是你需要jQuery之前mySubFile模塊? – Nitesh

+0

@NiteshI需要在其他任何東西之前注入jQuery。 – AndreaM16

回答

1

鑑於你在你的問題顯示代碼,這是真的要走的路:

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

但是,你不想使用它,因爲:

可以訪問myFuncti在,但我需要先解決jQuery

嘛,肯定jquery將收到你可以返回一個值來解決,但讓我們假設一秒鐘即有一些魔力,可以讓你的其他試圖返回所需的值,讓我們看一看它從什麼時候解決的角度來看。這是你擁有的一切:

define('mySubFile', ['jquery'], function ($) { 
    require(['dependency1'], function (dependency1) { 

這裏發生了什麼:執行

  1. define電話。RequireJS看到一個模塊名稱(mySubFile),一個依賴列表['jquery']和一個回調。
  2. RequireJS做出決議jquery並與它調用回調。
  3. require呼叫被執行。 RequireJS看到一個依賴列表和一個回調。
  4. RequireJS解決dependency1並調用回調。

這裏也是,jquery必須先解決,然後才能返回任何內容。在define回調中有一個require不會改變任何事情。

define內部撥打require呼叫以按照您希望的方式工作將需要大量重寫。順便說一句,你在那裏碰到的問題並不是特定於RequireJS,而是所有異步代碼都有的共同問題。請參閱this question瞭解常見問題及其解決方法。

+0

感謝您的解釋。我意識到問題的異步性。如果我喜歡你剛纔說的我沒有任何* undefined *的問題,但我的應用程序只是打破了某種方式,因爲我沒有先解決jquery。我正在看看你已經鏈接的問題,但無法找到解決jQuery問題的方法。也許使用** $文件(準備好)**? – AndreaM16

+0

我不清楚你爲什麼會遇到問題。在調用'define'的回調函數之前解析'jquery'。如果'dependency1' *也*依賴於'jquery',那麼你需要將'jquery'放入它的依賴關係列表中:要麼在define調用中,要麼它是第三方非AMD代碼段,需要在RequireJS配置中設置一個'shim',將'jquery'列爲依賴項。 – Louis

+0

例如,現在我有一個問題,我必須觸發一個給定的函數,該函數位於** $(document).ready **之後的另一個js文件中,但不知何故我得到了** externalFile.thatFunction()**未定義,因爲externalFile似乎與jQuery同時得到解決。 – AndreaM16

1

如果你總是需要jQuery的是你的模塊之前可用,您可以像這樣做:

define("mySubFile", function(require, exports, module){ 
    var a = require("jQuery"), // dependency 
     b = require("knockout"); // dependency 
    /* rest of the code for this module */ 

    let myFunction = function(){ return "Hey There"; } 

    return : { 
      myFunction : myFunction 
     } 
}); 
+0

這個問題不是由jQuery引起的,我已經能夠在其他任何東西之前獲得它。當該子文件具有require語句時,我遇到了有關從另一個文件訪問外部函數的問題。 – AndreaM16