JavaScriptの設計 ~ ModelとViewを考えながら書いてみる
フォームにテキストを入力すると配列にデータをプッシュするというWEBアプリでよくありそうな処理です。 色々やると難しいので、Modelはデータを管理してViewはDOMの操作を管理するという単純なルールのみ。
さらにデータをDOMに書き出すViewを作ると簡単なMV○になるかもしれないけど、とりあえずは単純な処理のみで書いてみた。
HTML
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <title>Document</title> <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script> <script type="text/javascript" src="src/js/myapp.js"></script> </head> <body> <form action="" class="todoForm"> <input type="text" /> <input type="submit" value="add" /> </form> </body> </html>
まずはHTML。Formにクラスを付けて管理。
名前空間
/** * namespace[MyApp] */ var MyApp = MyApp || {};
名前空間を設定する。
Model
/** * データを管理するModelクラス */ (function($,nss){ //個別のデータを管理するクラス ns.Item = function(text){ this.text = text; } //配列を管理するクラス ns.Data = function(){ this.list = []; } //配列にデータを追加するメソッド ns.Data.prototype = { add: function(text){ var item = new ns.Item(text); this.list.push(item); } } })(jQuery,MyApp);
個別のデータをItemクラス、配列をDataクラスで管理。
ここではDOMの操作やイベントに関する操作は一切しません。
View
/** * フォームを管理するViewクラス */ (function($,ns){ ns.ViewForm = function(el,data){ this.$el = $(el); this.$input = this.$el.find('input[type="text"]'); this.data = data; this.event(); } ns.ViewForm.prototype = { event: function(){ var that = this; that.$el.on('submit',function(e){ that.onSubmit(e); console.log(that.data.list); }); }, onSubmit: function(e){ e.preventDefault(); var text = this.getText(); if(text){ this.data.add(text); this.clearInput(); } }, getText: function(){ return this.$input.val(); }, clearInput: function(){ this.$input.val(''); } } })(jQuery,MyApp);
FormをViewFormクラスで管理。
FormがsubmitされるとModelの配列にデータを追加します。
イベントのみを管理しデータの管理はModelに任せます。
初期化
/** * 初期化 */ $(function(){ var data = new MyApp.Data(); new MyApp.ViewForm('.todoForm',data); });
最後に初期化。
配列を管理するDataクラスをインスタンス化して変数に格納してViewクラスに渡します。
フォームにテキストを入力してsubmitすると、データが追加されます。