2013-09-06 21 views
8

コレクションフェッチでモデルの解析機能を防止するにはどうすればよいですか?バックボーン - フェッチ後にコレクション内の各モデルを解析しない

$(function() { 
    var Task = Backbone.Model.extend({ 
     url : function() { 
       return this.urlRoot + this.id; 
     }, 
     urlRoot: 'index.php?c=light&a=list_tasks_bb&ajax=true&task=', 
     parse: function (response, options) { 
      console.log(options); 
      console.log(response); 
      return response; 
     } 
    }); 

    var TaskList = Backbone.Collection.extend({ 
     model: Task, 
     url: 'index.php?c=light&a=list_tasks_bb&ajax=true', 

     initialize: function() { 

     }, 
     parse: function (response, options) { 
      return response.tasks; 
     } 
    }); 

    var Light = Backbone.Router.extend({ 
     el: $('#light'), 
     routes: { 
      "tasks/:id": "taskAction", 
      "*page": "defaultAction", 
     }, 

     initialize: function() { 
      _this = this; 
      this.tasks = new TaskList(); 
      this.users = new UserList(); 
     }, 

     taskAction: function(id) { 
      this.task = new Task({id: id}); 
      $.when (
       this.task.fetch() 
      ).then(function(zzz) { 
       new TaskView({model: _this.task}).render(); 
      }); 
     }, 
     defaultAction: function(page) { 
      $.when (
       this.tasks.fetch(), 
       this.users.fetch() 
      ).then (function() { 
       new TaskListView({collection: _this.tasks}).render(); 
      }); 
     } 
    }); 
}); 

私はajaxを取得するモデルとコレクションを1つ持っています。私は、バックエンドを変更する機会がないので、タスクリストのJSONの構造は次のとおりです。

"contents": {}, 
"current": false, 
"errorCode": 0, 
"errorMessage": "", 
"u": 4, 
"tasks": [{ 
    "id": "12250", 
    "t": "ZZZ", 
    "cid": "24", 
    "c": "2013-08-22 11:36:32", 
    "dd": "02.09.2013", 
    "sd": "02.09.2013", 
    "pr": "300", 
    "pid": "0", 
    "atid": "1:4", 
    "s": 0, 
    "dl": "" 
}, { 
    "id": "12307", 
    "t": "ZZZ", 
    "cid": "42", 
    "c": "2013-08-28 11:14:44", 
    "dd": "05.09.2013", 
    "sd": "28.08.2013", 
    "pr": "200", 
    "pid": "0", 
    "atid": "1:4", 
    "s": 0, 
    "dl": "" 
}, { 
    "id": "12326", 
    "t": "ZZZ", 
    "cid": "2", 
    "c": "2013-08-29 09:55:34", 
    "dd": "31.08.2013", 
    "sd": "29.08.2013", 
    "pr": "200", 
    "pid": "0", 
    "atid": "1:4", 
    "s": 0, 
    "dl": "" 
}], 
"events": [] 

これは私がコレクションのための解析を使用している理由です。このステップではすべてが問題ありません。シングルタスクの JSON構造は次のとおりです。

"contents": {}, 
"current": false, 
"errorCode": 0, 
"errorMessage": "", 
"u": 4, 
"tasks": [{ 
    "id": "12250", 
    "t": "ZZZZ", 
    "cid": "24", 
    "c": "2013-08-22 11:36:32", 
    "dd": "02.09.2013", 
    "sd": "02.09.2013", 
    "pr": "300", 
    "pid": "0", 
    "atid": "1:4", 
    "text": "XXXXX", 
    "s": 0, 
    "dl": "" 
}], 
"comments": [{ 
    "id": "48178", 
    "text": "CCCC", 
    "cid": "4", 
    "con": "23.08.2013" 
}], 
"events": [] 

だから私は、後に単一のタスクをフェッチするために再度解析必要「(task.fetch)」。モデルの解析関数を追加した後は、コレクションの解析後にすでに正しいモデルデータがありますが、モデルごとにモデル解析コールバックが再度発生するため、フェッチコレクションを開始するまでうまく機能します。

これを修正する正しい方法があるのでしょうか、またはそれ以上にバックエンドを変更しようとしますか?

PS 確かに、私はこのような何か行うことができます。

if(response.tasks) { 
    return response.tasks[0]; 
    } else { 
    return response; 
    } 

をしかし、私はそれが正しい解決策ではないと思います。

答えて

23

creating models for insertion in a collectionとすると、バックボーンは将来のコレクションをモデルコンストラクタのオプションとして渡します。このコンストラクタは、このオプションをparseに転送します。あなたは、このプロパティをチェックし、必要に応じて解析を中止することができます:

var Task = Backbone.Model.extend({ 
    parse : function(response, options){ 
     if (options.collection) return response; 
     return response.tasks[0]; 
    } 
}); 
var TaskList = Backbone.Collection.extend({ 
    model: Task, 
    parse : function(response){ 
     return response.tasks; 
    } 
}); 

をデモhttp://jsfiddle.net/nikoshr/dfMgR/

+2

はあなたに感謝します!あなたは私に多くの時間を救った。 –

+1

再解析の問題、現実の救い主を発見するのに1日かかりました。 – topless

関連する問題