2012-05-14 4 views
7

Tôi bắt đầu tìm hiểu Backbone.js và tôi bắt đầu với this boilerplate và tạo một ví dụ bằng cách tải dữ liệu JSON từ một tệp tĩnh trên đĩa và hiển thị nó trong bảng html .Phương thức hủy của mô hình Backbone.js không kích hoạt thành công hoặc lỗi sự kiện

Sau đó, tôi đã cố gắng ràng buộc một sự kiện trên một nút được cho là xóa một phần tử khỏi bộ sưu tập, sau đó từ DOM. Điều hoạt động tốt, bấm vào kích hoạt phương pháp destroy, sự kiện remove được kích hoạt chế độ thu, nhưng không đi ra của success hoặc error callbacks của destroy

Bất kỳ ai có một đầu mối?

Mô hình:

define([ 
    'underscore', 
    'backbone' 
], function(_, Backbone) { 
    var memberModel = Backbone.Model.extend({ 
    url: "/members.json", 
    defaults: { 
     email: "", 
     firstname: "", 
     lastname: "", 
     gender: "", 
     language: "", 
     consent: false, 
     guid: "", 
     creationDate: "" 
    }, 
    initialize: function(){ 
    } 

    }); 

    return memberModel; 

}); 

Quan điểm:

define([ 
    'jquery', 
    'underscore', 
    'backbone', 
    'mustache', 
    'collections/members', 
    'text!templates/members/page.html' 
], function($, _, Backbone, Mustache, membersCollection, membersPageTemplate){ 
    var membersPage = Backbone.View.extend({ 
    el: '.page', 
    initialize: function(){ 
     this.members = new membersCollection(); 

     this.members.on('remove', function(){ 
       // works fine 
      $('.members-body tr').first().remove(); 
      console.log('removed from collection'); 
     }); 
    }, 

    render: function() { 
     var that = this; 

     this.members.fetch({success: function(){ 

      var wrappedMembers = {"members" : that.members.toJSON()}; 

      that.$el.html(Mustache.render(membersPageTemplate, wrappedMembers)); 

      $('#delete-member').click(function(){ 
       that.members.at(0).destroy({ 
         // prints nothing!!! 
        success: function(){ console.log('sucess'); }, 
        error: function(){ console.log('error'); } 
       }); 

      }); 

     }}); 

    } 
    }); 
    return membersPage; 
}); 
+0

Bạn có tập hợp 'url' cho mô hình hoặc bộ sưu tập của mình không? –

+0

Có, 'url' được đặt trên cả hai mô hình và bộ sưu tập – MaxiWheat

Trả lời

7

Tôi đồng ý rằng đây là số lẻ. Tôi không hoàn toàn chắc chắn điều gì đang xảy ra, nhưng đây là những gì tôi nghi ngờ ...

Các cuộc gọi Destroy() của bạn không trả về JSON hợp lệ.

  • Xem firebug, fiddler hoặc bất cứ điều gì, phản hồi tiêu diệt của bạn() trông như thế nào?
  • Tôi cũng tò mò xem that là gì khi chức năng xóa của bạn được kích hoạt.
  • Không phá hủy trả về false hoặc đối tượng jqXHR?

Có một chút ngắt kết nối trong xương sống (ít nhất là với tôi lúc đầu). Khi gọi destroy() hoặc tìm nạp/lưu cho vấn đề đó, cuộc gọi không đồng bộ. Ngay sau cuộc gọi, sự kiện xóa sẽ kích hoạt và bộ sưu tập của bạn có thể phản hồi. Nhưng, đào một chút sâu hơn trong tài liệu, sự kiện khác là bắn lên xác nhận xóa:

một "đồng bộ hóa" sự kiện, sau máy chủ đã thừa nhận thành công xóa của mô hình

Vì vậy, bộ sưu tập của bạn đang hành động dựa trên giả định rằng việc xóa đã thành công. Nếu bạn muốn bộ sưu tập của mình phản hồi lại việc xóa đã xác nhận, hãy tìm sự kiện sync.

Điều này để lại một điểm dai dẳng - tại sao trình xử lý lỗi của bạn không kích hoạt? Vâng, các cuộc gọi lại được thiết kế để đáp ứng với xác nhận xóa. Nhưng tôi đặt cược ngăn xếp JS gọi không biết làm thế nào để giải thích các phản ứng nó nhận được trở lại, như là một thành công hay lỗi. Bạn có thể tình cờ gặp các thực tại của AJAX. Tôi đã tìm thấy trong xương sống, jquery, và bó của các khuôn khổ khác mà bạn có thể nhầm lẫn xử lý lỗi ajax. Google "lỗi jquery ajax không được gọi" và bạn sẽ tìm thấy một loạt các tình huống khác nhau trong đó sự kiện lỗi không được kích hoạt.


CẬP NHẬT

Sau các ý kiến ​​qua lại ... hai điều đang xảy ra.Đầu tiên, mô hình của bạn được coi là 'mới' có nghĩa là các cuộc gọi đến Destroy() không thực hiện yêu cầu máy chủ. Kết quả là thành công/lỗi của bạn không kích hoạt. Xem this commit.

Với điều đó đã nói, tôi không nghĩ rằng bạn xem xét mô hình mới của mình (không được lưu vào máy chủ). Bạn cần phải làm một trong hai điều. Bao gồm một thuộc tính có tên là idHOẶC trong bản đồ mô hình của bạn, ID mô hình của bạn (guid tôi giả định) vào ID của mô hình. Lập bản đồ dễ dàng bằng cách thêm dòng sau vào mẫu của bạn: idAttribute: "guid". Bạn có thể xem thêm trên idAttribute here.

+0

Tôi đang thử nghiệm trong Google Chrome và khi tôi xem tab Mạng, nó không có gì khi tôi gọi' hủy'. Tôi cũng đã thử Fiddler để kiểm tra xem một yêu cầu http DELETE được gửi đi, nhưng cũng vậy, không có gì xảy ra. – MaxiWheat

+0

Vui lòng thêm định nghĩa mô hình của bạn vào bài đăng gốc (bao gồm cả phản hồi JSON từ tìm nạp). Ngoài ra, ngay trước khi xóa giá trị của 'that.members.at (0) .IsNew' là gì? – EBarr

+0

Ngoài ra, dòng này 'this.members = new membersCollection;' là số lẻ. Tôi sẽ mong đợi một sự xác nhận trực tiếp, hoặc nếu bạn đang sử dụng dấu ngoặc đơn 'mới' sau' membersCollection() ' – EBarr