2014-01-26 66 views
0

如果不使用諸如Require.js之類的東西,我會在應用程序加載到用戶的Web瀏覽器時實例化應用程序客戶端控制器等內容。通過這種方式,在瀏覽器中應用程序的整個生存期內,內存中的每個控制器都將保持單個實例。使用require.js,避免重複新增對象

當Require.js被引入時,實現相同事物的慣用方法是什麼?

+0

無論如何,RequireJs模塊都是單例,不是嗎? – Bergi

回答

2

我會推薦在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拉入模塊流的一部分。

+0

那麼,我可以將我的導出包裝在控制實例化的函數中,將它們存在的現有實例重新使用? – Ben

+0

您的意思是導出一個工廠函數,您可以調用它來獲取某個實例,並且該工廠函數將緩存該實例?當然,我的意思是,你可以做任何事情,我不認爲有一種慣用的「Require.js」方式,它只是軟件工程。我傾向於在現有的框架/庫中尋找靈感 - 例如看節點人們如何使用require()等 – Karolis