Javascript MVC——Model
原文:http://javascriptmvc.com/docs.html#&who=jQuery.Model
通訳:劉貴学[email protected])
モデルは、アプリケーションをカプセル化するためのデータ層である.大きな応用においてモデルは非常に重要である:
二つの実現方法があります.
jQuery.Model類は、あなたのアプリケーションのデータ層を組織するための基本的な枠組みを提供します.まずAjaxの操作を見て、モデルの状況を考慮しないでください.もしアプリケーションがあれば、次のように要求します.
模型を使わないでどうやって実現するかを見ましょう.
$.Controller.extend("MyApp.Controllers.Tasks",{onDocument: true},
{
// ,
ready: function() {
$.get('/tasks.json', this.callback('gotTasks'), 'json')
},
/* json , :
* [{name: "trash", due_date: 1247111409283}, ...]
*/
gotTasks: function( json ) {
for(var i =0; i < json.length; i++){
var taskJson = json[i];
//
var remaininTime = new Date() - new Date(taskJson.due_date);
// html
$("#tasks").append(""+
""+
"Due Date = "+remaininTime+"")
}
},
// ,
// , id, post ,
".task click" : function( el ) {
$.post('/tasks/'+el.attr('data-taskid')+'.json',
{complete: true},
function(){
el.remove();
})
}
})
このときコードもよさそうですが、この場合:$.Controller.extend("MyApp.Controllers.Tasks",{onDocument: true},
{
load: function() {
Task.findAll({},this.callback('list'))
},
list: function( tasks ) {
$("#tasks").html(this.view(tasks))
},
".task click" : function( el ) {
el.model().update({complete: true},function(){
el.remove();
});
}
})
views/task/list.ejsファイルの内容は以下の通りです.
>
このようにするのはずっと良くなりましたか?もちろん、これらの改善は、ビューを使用しても、我々のコントローラを完全に読むことができます.モデルを見せてください.$.Model.extend("Task",
{
findAll: "/tasks.json",
update: "/tasks/{id}.json"
},
{
timeRemaining: function() {
return new Date() - new Date(this.due_date)
}
})
これは、Ajax機能を単独で実現し、リターン時にこれらのデータをカプセル化することができるからです.私たちにコントローラとビューの各太字項目について話します.
Task.findAll
TaskのfindAll関数は「/tasky.json」からデータを要求し、データが戻ったらまず「wrapMany」関数を実行してから成功後のコールバック関数に伝えます.
もし、コールバック関数がどうやって仕事をするかわからないなら、wrapManyとcalbackを見てもいいです.
el.model
jQuery.fn.modelはjQueryの補助ツールで、これはhtml要素の中から1つのモデルの実例を返すことができます.list.ejsテンプレートはすべてのタスクをhtml要素に変えます.
> ...
残り時間はtimeRemaningです.timeRemaningはモデル中の元のデータをカプセル化するための関数の一例です.
他の良いもの
以上はただモデル機能に関する小さな試みです.次のような特性を見せてください.
パッケージ
サービスとの対話を学ぶにはどうすればいいですか?
$.Model("Task",{
findAll : "/tasks.json",
findOne : "/tasks/{id}.json",
create : "/tasks.json",
update : "/tasks/{id}.json"
},{})
タイプ変換「10-20-1982」のデータを自動的にnew Dateに変換します(1982,9,20)
$.Model("Task",{
attributes : {birthday : "date"}
convert : {
date : function(raw){ ... }
}
},{})
jQuery.Model.List学習はどのようにして簡単に複数の例を処理しますか?
$.Model.List.extend("Task.List",{
destroyAll : function(){
var ids = this.map(function(c){ return c.id });
$.post("/destroy",
ids,
this.callback('destroyed'),
'json')
},
destroyed : function(){
this.each(function(){ this.destroyed() });
}
});
".destroyAll click" : function(){
this.find('.destroy:checked')
.closest('.task')
.models()
.destroyAll();
}
検証モデルのプロパティを確認します.
$.Model.extend("Contact",{
init : function(){
this.validate("birthday",function(){
if(this.birthday > new Date){
return "your birthday needs to be in the past"
}
})
}
,{});