Convention over configuration MVVM för JS
Jag har länge saknat ett CoC-bibliotek för JS som liknar Caliburn Micro för WPF, dvs att mycket av koden sker implicit genom konventioner.
Så jag tog saken i egna händer och skapade detta bibliotek som bygger på Knockout som template/MVVM bibliotek
Jag har haft den uppe ett tag på Github men först nu alla funktioner börjar komma på plats
https://github.com/AndersMalmgren/Knockout.BindingConventions
Vad kan man då göra med detta undrar ni? Som ett superenkelt exempel här har ni en Vy skriven utan mitt bibliotek.
<button data-bind="click: save, enable: canSave">Save</button>
Och här med
<button data-name="save">Save</button>
Skillnaden är att by convention fattar biblioteket att du vill att savemetoden på din vymodell ska trigga när man klickar på knappen, samt om det finns en medlem canSave ska denna användas för att styra om det går att klicka på knappen. Testa här http://jsfiddle.net/3Ajnj/13/
Förutom att HTML-markupen blir renare så vinner du även en performance boost, standard KO måsten evaluera "click: save, enable: canSave" via eval() medans min kod istället använder vanlig objekt indexering vilket är mycket snabbare.
Här kan ni hitta alla inbyggda konventioner som finns https://github.com/AndersMalmgren/Knockout.BindingConventions...
En grej till som jag är stolt över är att jag gjort JS mer statiskt typat. Eftersom jag är en .NET utvecklare är jag stark förespråkare av statiska språk som C#. MEN... För GUIn är dynamiska språk att föredra, titta tex på all reflection man måste göra i MVC för att det ska fungera, detta slipper man med JS. Dock när man sysslar med Convention over configuration i MVVM så är faktiskt statiska typer att föredra i många fall.
Som exempel, för att koppla ihop en vy med en vymodell i standard knockout måste man explicit koppla ihop en vymodell med sin vy, tex
<div data-bind="template: { name: 'CustomerView', data: selectedCustomer }"></div>
Med mitt bibliotek blir det istället
<div data-name="selectedCustomer"></div>
Den fattar att selectedCustomer är av typen CustomerViewModel och matchar då ihop modellen med vyn CustomerView
http://jsfiddle.net/xJL7u/5/
Hoppas ni har nytta av mitt bibliotek, säg till om ni undrar nått!