Download - Wzorzec MVC w JavaScript

Transcript
Page 1: Wzorzec MVC w JavaScript

MVC

Page 2: Wzorzec MVC w JavaScript

ModelView

Controller

Page 3: Wzorzec MVC w JavaScript

MV*?

Page 4: Wzorzec MVC w JavaScript

Backbone.js

Page 5: Wzorzec MVC w JavaScript

Ember.js

Page 6: Wzorzec MVC w JavaScript

i tak dalej

Page 7: Wzorzec MVC w JavaScript

http://todomvc.com/

Page 8: Wzorzec MVC w JavaScript

Smalltalk MVC

Page 9: Wzorzec MVC w JavaScript

widok odpowiada za UI (w domyśle - DOM)

Page 10: Wzorzec MVC w JavaScript

var view = function(model, controller) { // widok wie o kontrolerze i modelu};

Page 11: Wzorzec MVC w JavaScript

model reprezentuje warstwę danych - np. item w TodoLiście

lub całą listę TODO

Page 12: Wzorzec MVC w JavaScript

var model = function() { var data = { title: "foobar" }; // model nie wie o kontrolerze i widoku};

Page 13: Wzorzec MVC w JavaScript

kontroler decyduje o przepływie danych w aplikacji

Page 14: Wzorzec MVC w JavaScript

var controller = function(model) { return { setNewTitle : function(val) { } };};

Page 15: Wzorzec MVC w JavaScript

sterowanie odbywa się poprzez kontroler (wzorzec Strategy)

Page 16: Wzorzec MVC w JavaScript

widok wydaje komunikaty dla modelu przez kontroler

Page 17: Wzorzec MVC w JavaScript

var view = function(model, controller) { controller.setNewTitle($("input.title").val());};

Page 18: Wzorzec MVC w JavaScript

widok obserwuje zmiany w modelu

Page 19: Wzorzec MVC w JavaScript

widok wie o zmianach w modelu dzięki implementacji

wzorca Observer w modelu

Page 20: Wzorzec MVC w JavaScript

jednym słowem mając referencję do modelu możemy

nasłuchiwać na zdarzenia, które on emituje

Page 21: Wzorzec MVC w JavaScript

var view = function(model, controller) { model.addEventListener("updated", function() { console.log("cos sie zmienilo w modelu"); });};

Page 22: Wzorzec MVC w JavaScript

widok może mieć podwidoki (wzorzec Composite)

Page 23: Wzorzec MVC w JavaScript

widok korzysta z danych modelu

Page 24: Wzorzec MVC w JavaScript

var view = function(model, controller) { var items = model.getItems();};

Page 25: Wzorzec MVC w JavaScript

widok tworzy lub „dostaje” kontroler

Page 26: Wzorzec MVC w JavaScript

var view = function(model, controller) { var controller = controller || makeMyController();};

Page 27: Wzorzec MVC w JavaScript

model musi udostępniać coś w rodzaju addEventListener

Page 28: Wzorzec MVC w JavaScript

np. w ten sposób:

var model = function() { var data = { title: "foobar" };

return { addEventListener : function() { //... } };};

Page 29: Wzorzec MVC w JavaScript

jak widok daje znać, że coś się zmieniło i należy uaktualnić

dane w modelu?

Page 30: Wzorzec MVC w JavaScript

var view = function(model, controller) { controller.setNewTitle($("input.title").val());};

var controller = function(model) { return { setNewTitle : function(val) { if (val !== "") { model.set("title", val); } else { throw new Error("validation error"); } } };};

Page 31: Wzorzec MVC w JavaScript

w uproszczeniu...

Page 32: Wzorzec MVC w JavaScript

var view = function(model, controller) { controller.setNewTitle($("input.title").val()); model.addEventListener("title:changed", function(data) { $("input.title").val(data.value); });};var model = function() { var data = { title: "foobar" }, observer = makeObserver(); return { set: function(key, val) { data[key] = val; observer.trigger(key + ":changed"); }, addEventListener: observer.addEventListener };};var controller = function(model) { return { setNewTitle : function(val) { if (val !== "") { model.set("title", val); } else { throw new Error("validation error"); } } };};

Page 33: Wzorzec MVC w JavaScript

krok po kroku w przypadku TODO List

Page 34: Wzorzec MVC w JavaScript

1. umożliwiamy dodanie nowego itemu TODO w widoku - np. nasłuchując na kliknięcie przycisku dodaj

Page 35: Wzorzec MVC w JavaScript

1. dodajemy item TODO w widoku2. widok przekazuje nazwę (np. „zrób zakupy”) tego itemu do kontrolera

Page 36: Wzorzec MVC w JavaScript

1. dodajemy item TODO w widoku2. widok przekazuje nazwę tego itemu do kontrolera3. kontroler sprawdza, czy dana wartość jest poprawna i tworzy model itemu (itemModel) po czym dodaje go do listy listModel

Page 37: Wzorzec MVC w JavaScript

1. dodajemy item TODO w widoku2. widok przekazuje nazwę tego itemu do kontrolera3. kontroler sprawdza, czy dana wartość jest poprawna i tworzy model itemu (itemModel) po czym dodaje go do listy listModel4. Model listModel dodaje nowy item i emituje zdarzenie „itemAdded”

Page 38: Wzorzec MVC w JavaScript

1. dodajemy item TODO w widoku2. widok przekazuje nazwę tego itemu do kontrolera3. kontroler sprawdza, czy dana wartość jest poprawna i tworzy model itemu (itemModel) po czym dodaje go do listy listModel4. Model listModel dodaje nowy item i emituje zdarzenie „itemAdded”5. widok odpowiedzialny za wyświetlanie listy itemów nasłuchuje na zdarzenie „itemAdded” i odpowiednio reaguje czyszcząc dotychczasową listę itemów i aktualizując ją o dane z listModel - np. var items = listModel.getItems();