2012-07-16 79 views
2

我是一位ActionScript 3開發人員,他正在構建大型JavaScript應用程序的第一步。 所以我理解模塊並理解AMD是一個很好的使用模式。我閱讀了RequireJS並實施了它。但是,我仍然不明白的是如何實現跨模塊通信。我知道應該有某種中介... 我閱讀文章和帖子,仍然無法理解如何簡單地實現它。 這裏是我的代碼,簡化:從RequireJS開始,模塊之間的通信

main.js

require(["Player", "AssetsManager"], function (player, manager) { 
    player.loadXML(); 
}); 

Player.js

define(function() { 
    function parseXml(xml) 
    { 
     // NOW HERE IS THE PROBLEM -- how do I call AssetsManager from here??? 

     AssetsManager.queueDownload($(xml).find("prop").text()); 
    } 

    return { 
     loadXML: function() { 
      //FUNCTION TO LOAD THE XML HERE, WHEN LOADED CALL parseXml(xml) 
     } 

    } 

}); 

AssetsManager.js

define(function() { 
    var arrDownloadQueue = []; 

    return { 
     queueDownload: function(path) { 
      arrDownloadQueue.push(path); 
     } 
    } 
}); 

任何「傻瓜」的幫助將不勝感激:) 謝謝。

回答

1

要從另一個模塊中加載模塊define(),只需將第一個參數設置爲一個數組,其中包含模塊名稱。因此,假設在您的代碼中,您想要將Player.js加載到AssetsManager.js中,那麼只需將字符串Player包含在數組中。

這完全是可能的,因爲define的抽象實現相當於require,只傳遞給define回調預計要返回一個值,這將增加一個‘模塊’,以依賴項的列表,你可以加載。

AssetsManager.js

define(['Player'], function (player) { 
    //... Your code. 
}); 

但是,如果我可以添加到它,我個人比較喜歡使用的require傳遞給define搶要加載的依賴回調的內部,而不是將參數傳遞給回調函數。

因此,這裏是我的建議:

define(['Player'], function() { 
    var player = require('Player'); 
}); 

,這是因爲它順應了CommonJS得多。

這是怎麼main.js看起來像格式化更加CommonJS的友好:

require(["Player", "AssetsManager"], function() { 
    var player = require('Player'); 
    var manager = require('AssetsManager'); 
    player.loadXML(); 
}); 

但是做事情的方式CommonJS的僅僅是一個個人喜好。我的理由是,您在數組中輸入依賴項名稱的順序可能會隨時更改,我不希望必須遍歷數組和參數列表。

我的另一個基本原理是,我來自Node.js的世界,模塊通過require()加載。

但這取決於你。

+1

是的,它的工作原理!其實很簡單,謝謝。 – Light 2012-07-16 08:59:38

0

(這將是skizeey的回答答覆,但我沒有爲足夠的聲譽)

沒有球員的AssetManager依賴拉動解決這個問題的另一種方法通過要求是傳遞AssetManager實例main.js已經有了。完成此操作的一種方式可能是讓Player的loadXML函數接受一個AssetManager參數,然後傳遞給parseXml,然後使用它。另一種方式可能是讓Player擁有一個變量來存放一個AssetManager,該變量被parseXml讀取。它可以直接設置,或者可以使用一個函數來存儲AssetManager中可以使用的變量,稱爲sayAssetManager。後一種方式有一個額外的考慮 - 然後你需要處理這個變量在調用loadXml之前沒有被設置的情況。這個概念通常被稱爲「依賴注入」。

要清楚我不建議使用AMD來加載它。我只是想爲您提供更多選項;也許這種技術在解決另一個問題時可能會幫助你,或者可能幫助其他人。 :)