如果不使用諸如Require.js之類的東西,我會在應用程序加載到用戶的Web瀏覽器時實例化應用程序客戶端控制器等內容。通過這種方式,在瀏覽器中應用程序的整個生存期內,內存中的每個控制器都將保持單個實例。使用require.js,避免重複新增對象
當Require.js被引入時,實現相同事物的慣用方法是什麼?
如果不使用諸如Require.js之類的東西,我會在應用程序加載到用戶的Web瀏覽器時實例化應用程序客戶端控制器等內容。通過這種方式,在瀏覽器中應用程序的整個生存期內,內存中的每個控制器都將保持單個實例。使用require.js,避免重複新增對象
當Require.js被引入時,實現相同事物的慣用方法是什麼?
我會推薦在AMD模塊中導出類 - 不是實例。例如。
// controllers/some_controller.js
define(function (require) {
function SomeController() {};
SomeController.prototype.foo = function() {};
return SomeController;
});
然後管理對象的生命週期的其他地方,也許在你app.js你這樣做
// app.js
define(function (require) {
var SomeController = require("./controllers/some_controller");
var activeController;
...
router.on("/foo", function() {
if (activeController) {
activeController.destroy();
}
activeController = new SomeController();
});
});
或者,如果你想擁有的控制器是單身,就像你說的,你可以做這樣的事情
// app.js
define(function (require) {
var controllers = {
"some": require("./controllers/some_controller")
};
var controllerCache;
function getController(name) {
if (!controllerCache[name]) {
controllerCache[name] = new controllers[name]();
}
return controllerCache[name];
}
var activeController;
...
router.on("/foo", function() {
if (activeController) {
activeController.exit();
}
activeController = getController("some");
});
});
不管怎麼說,這些都是非常令人費解的例子,但我的主要觀點是,我建議導出類在你的模塊 - 不是實例 - 這樣你」重新控制你如何管理這些對象及其生命週期,它還有助於可測試性,因爲你可以要求類,存根,提供模擬依賴關係等等。(關於使用容器查找各種對象實例的更高級示例,請查看http://www.slideshare.net/mixonic/containers-di 。他甚至舉了一個如何與AMD模塊一起使用的例子)
希望這有些幫助。
UPDATE 當然,你也可以導出函數,或函數對象以及其他任何適當的,但很有可能你不希望實例化的東西或者在你的模塊的頂層執行的事 - 最好做爲應用程序流的一部分,而不是作爲require.js拉入模塊流的一部分。
無論如何,RequireJs模塊都是單例,不是嗎? – Bergi