1、界面與數據的分離,必須體現在代碼上,界面的代碼歸界面的代碼,數據的代碼歸數據的代碼,兩者必須泾渭分明。
2、當界面需求發生改變,只需要改寫界面的代碼,並且所改寫的代碼不能影響到數據訪問的代碼。
只有做到這兩者才算界面與數據分離。葉小钗同學讓我上代碼,趁今天還不是很忙,寫下了下面的代碼:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <title></title> <script src="http://code.jquery.com/jquery-1.10.2.min.js"></script> <script> $(function () { var Countries = function () { } Countries.prototype = { _items: [], _getData: function (success) { var items = [ { id: 0, name: '中國' }, { id: 1, name: '日本' }, { id: 2, name: '美國' } ]; $.extend(this._items, items); success(items); }, //Events on_selected: $.Callbacks(), on_inserted: $.Callbacks(), //Methods select: function () { var self = this; this._getData(function (items) { self.on_selected.fire({ sender: self, items: items }); }); }, insert: function (item) { var self = this; this._items.push(item); self.on_inserted.fire({ sender: self, item: item }); } } //======================================================================= // 以下為界面代碼,當要調整界面,改這裡就行啦~~~ var countries = new Countries(); countries.on_selected.add(function (args) { $(args.items).each(function () { $('#countries').append($('<option>').attr('value', this.id).text(this.name)); }); }); countries.on_inserted.add(function (args) { $('#countries').append($('<option selected="selected">').attr('value', args.item.id).text(args.item.name)); }); var id = 10; $('#btnAdd').click(function () { countries.insert({ id: ++id, name: $('#countryName').val() }); }); countries.select(); //======================================================================= }); </script> </head> <body> <select id="countries"></select> <div> <input id="countryName" /><button id="btnAdd">添加</button> </div> </body> </html>
代碼是可以直接Copy運行的,界面如下圖:
上面的代碼,真正做到了界面與數據的分離:
1、在數據訪問的代碼,沒有一行涉及到UI的,如果有一行,哪怕一行涉及到,都不能算是界面與數據分離。(簡單點說,就是數據訪問的代碼,不能對UI有依賴)
2、當界面需求發生變化,只要修改界面的代碼就可以了。
3、數據訪問的代碼會不會發生變化?一般來說,這個是很少會發生變化的(相比界面)。假如發生變化了,需要修改數據訪問的代碼,所作的修改並不會影響到界面的代碼。
關於代碼,我就不作解釋了,相信有點基礎的同學都能看懂