2013-09-06 36 views
8

Làm cách nào để ngăn chức năng phân tích cú pháp cho mô hình trong tìm nạp bộ sưu tập?Xương sống - không phân tích từng mô hình trong bộ sưu tập sau khi tìm nạp

$(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(); 
      }); 
     } 
    }); 
}); 

Tôi có một mô hình và một bộ sưu tập mà tôi có được thông qua tìm nạp ajax. Tôi không có cơ hội thay đổi chương trình phụ trợ, do đó cấu trúc json của danh sách nhiệm vụ là:

"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": [] 

Đây là lý do tôi sử dụng phân tích để thu thập. Trong bước này mọi thứ đều ổn. Cấu trúc JSON cho một tác vụ là:

"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": [] 

Vì vậy, tôi cần phân tích cú pháp lần nữa để tìm nạp tác vụ đơn sau "task.fetch()". Sau khi tôi thêm chức năng phân tích cú pháp vào mô hình, nó hoạt động tốt cho đến khi tôi bắt đầu tìm nạp bộ sưu tập, vì sau khi thu thập phân tích cú pháp tôi đã có dữ liệu mô hình chính xác, nhưng mô hình gọi lại cho mỗi mô hình một lần nữa.

Tôi có cách khắc phục sự cố này hoặc tốt hơn sẽ cố gắng thay đổi chương trình phụ trợ không?

PS Chắc chắn, tôi có thể làm một cái gì đó như thế này:

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

Nhưng tôi nghĩ rằng nó không phải là giải pháp đúng.

Trả lời

23

Khi creating models for insertion in a collection, Backbone chuyển bộ sưu tập trong tương lai dưới dạng tùy chọn cho hàm tạo mô hình mà lần lượt chuyển tiếp tùy chọn này tới parse. Bạn có thể kiểm tra tài sản này và hủy bỏ việc phân tích cú pháp khi cần thiết:

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; 
    } 
}); 

Và một bản demo http://jsfiddle.net/nikoshr/dfMgR/

+2

THANK YOU! bạn đã cứu tôi rất nhiều thời gian. –

+1

Tôi mất một ngày để phát hiện ra vấn đề phân tích lại, vị cứu tinh thực sự. – topless

Các vấn đề liên quan