MVC, MVP a páteř.js
Existuje jen velmi málo, pokud vůbec architektonických rámců JavaScript, které tvrdí, že k provedení MVC nebo MVP vzory v jejich klasické podobě, jak mnoho vývojářů JavaScript nemám názor, MVC a MVP jako vzájemně se vylučující (jsme ve skutečnosti více pravděpodobné, že vidět MVP prováděna přísně při pohledu na web frameworky jako jsou ASP.NET nebo GW). Je to proto, že je možné mít v naší aplikaci další logiku presenteru/zobrazení a stále ji považovat za příchuť MVC.
páteřní přispěvatel Bostonské Bocoup Irene Ros se hlásí k tomuto způsobu myšlení, jako když odděluje názory do svých vlastních odlišných složek, potřebuje něco, aby je pro ni skutečně sestavila. To by mohlo být buď správce trasy (např. Backbone.Router
, na něž se později v knize), nebo zpětné volání v reakci na data stahuje.
to znamená, že někteří vývojáři mají pocit, že páteř.js lépe odpovídá popisu MVP než MVC. Jejich názor je, že:
-
presenter v MVP lépe popisuje
Backbone.View
(vrstva mezi Zobrazení šablon a dat, aby to), než správce. -
model se hodí
Backbone.Model
(Vůbec se neliší od modelů v MVC). -
pohledy nejlépe reprezentují šablony (např.
odpověď na to může být, že pohled může být také jen pohled (podle MVC), protože páteř je dostatečně flexibilní, aby mohl být použit pro více účelů. V v MVC a P v MVP mohou oba být dosaženo tím Backbone.View
, protože jsou schopni dosáhnout dvěma účelům: oba vykreslování atomových komponent a montáž těchto komponent poskytnuté jinými názory.
také Jsme viděli, že v Páteřní odpovědnost správce je společná s oběma Backbone.View
Backbone.Router
a v následujícím příkladu, můžeme skutečně vidět, že aspekty, které jsou určitě pravda.
naše páteř PhotoView
používá vzor pozorovatele k „odběru“ změn modelu pohledu v řádku this.model.bind("change",...)
. To také se zabývá templating v render()
metoda, ale na rozdíl od některých jiných implementacích, uživatelská interakce je také zpracována v Zobrazení (viz events
).
var
PhotoView
=
Backbone
.
View
.
extend
({
//... is a list tag.
tagName
:
"li"
,
// Pass the contents of the photo template through a templating
// function, cache it for a single photo
template
:
_
.
template
(
$
(
"#photo-template"
).
html
()
),
// The DOM events specific to an item.
events
:
{
"click img"
:
"toggleViewed"
},
// The PhotoView listens for changes to
// its model, re-rendering. Since tHere's
// a one-to-one correspondence between a
// **Photo** and a **PhotoView** in this
// app, we set a direct reference on the model for convenience.
initialize
:
function
()
{
this
.
model
.
on
(
"change"
,
this
.
render
,
this
);
this
.
model
.
on
(
"destroy"
,
this
.
remove
,
this
);
},
// Re-render the photo entry
render
:
function
()
{
$
(
this
.
el
).
html
(
this
.
template
(
this
.
model
.
toJSON
()
));
return
this
;
},
// Toggle the `"viewed"` state of the model.
toggleViewed
:
function
()
{
this
.
model
.
viewed
();
}
});
Další (zcela odlišný) názor je, že Páteř se více podobá Smalltalk-80 MVC, které jsme prožili dříve.
Jako pravidelné Páteřní blogger Derick Bailey již dříve řečeno, že je to nakonec nejlepší nenutit Páteř, aby se vešly jakékoliv specifické návrhové vzory. Návrhové vzory by měly být považovány za flexibilní návody, jak mohou být aplikace strukturovány, a v tomto ohledu se páteř nehodí ani MVC, ani MVP. Místo toho si půjčuje některé z nejlepších konceptů z více architektonických vzorů a vytváří flexibilní rámec,který funguje dobře.
stojí však za pochopení, kde a proč tyto pojmy vznikly, takže doufám, že moje vysvětlení MVC a MVP pomohlo. Říkejte tomu páteřní cesta, MV*, nebo cokoli, co pomáhá odkazovat na jeho chuť aplikační architektury. Většina strukturálních rámců JavaScript přijme svůj vlastní pohled na klasické vzory, ať už úmyslně nebo náhodou, ale důležité je, že nám pomáhají vyvíjet aplikace, které jsou organizovány, čisté a lze je snadno udržovat.