2012-09-21 9 views
8

Mam modelu, które muszą być dostępne dla kilku widokach i do osiągnięcia tego celu w definicji modułu modelu mam instancji go natychmiast tak:Modele szkieletu Singleton z RequireJS: anti-pattern?

define([ 
    'jquery', 
    'underscore', 
    'backbone' 
], function(_, Backbone) { 
    var Foo = Backbone.Model.extend({ 
     // wondrous methods and properties 
    }); 

    return new Foo(); 
}); 

ja naprawdę potrzebuję tylko jedno wystąpienie tego modelu - właśnie teraz. Rozwiązaniem tego problemu jest, o ile wiem, oddzielny moduł App. Coś jak:

define([], function() { 
    var App = { 
     routers: {}, 
     models: {}, 
     views: {} 
    }; 

    return App; 
}); 

, na którym można przechowywać instancji i odwołań do obiektów na starcie aplikacji:

require([ 
    'App', 
    'Foo' 
], function(App, Foo) { 
    App.models.foo = new Foo(); 
}); 

ale czuję, że jest to słaba alternatywa ponieważ jesteś zasadniczo wraca do posiadające globalna przestrzeń nazw - coś, co ma pomóc RequireJS.

Czy są jakieś alternatywy i czy istnieje jakiś dobry powód, aby unikać modeli singletonowych, tak jak opisałem powyżej?

+0

Powinieneś być całkowicie w porządku, tak jak zrobiłeś to w swoim pierwszym przykładzie. –

Odpowiedz

3

Nie trzeba tworzyć rzeczy nazw. Twój pierwszy przykład tworzy singleton. Ilekroć potrzebujesz tego modułu, otrzymujesz to samo wystąpienie swojego modelu. Zamiast więc tworzyć nowy moduł aplikacji i zapisać tam instancję, wystarczy bezpośrednio pobrać moduł z pierwszego przykładu. Używamy go w naszej aplikacji, aby mieć pojedynczą instancję naszej aplikacji i nie widzę w tym żadnych pułapek.