2012-05-14 2 views
5

Tôi có thiết lập rất đơn giản ...Đồng bộ Backbone.js không kích hoạt bất kỳ sự kiện nào trên mô hình

Tuyến đường được thiết lập gọi một hộp thoại phương thức sử dụng bootstrap. Các headerView gọi một phương thức khi một trình đơn được nhấp -

menuClick: function(e){ 
    e.preventDefault(); 
    if (!this.myView) { 
     this.myView= new MyView({model: new MyModel()}); 
    } 
    this.myView.render(); 
}, 

Trong MyView tôi gọi bind trong khởi

initialize: function(){ 
    this.model.bind('sync', function(model){ alert('test view')}); 
} 

Và gọi Backbone.sync trong một sự kiện nút bấm:

var response = Backbone.sync('read', this.model, { 
    success: function(data, textStatus, jqXHR) { alert('success'); }, 
    error: function(data, textStatus, jqXHR){ alert(fail); } 
}); 

Cảnh báo bên trong đồng bộ hóa được gọi ... nhưng cảnh báo trong lệnh bind trong khởi tạo không bao giờ được gọi. Đã cố gắng di chuyển các ràng buộc bên trong mô hình, di chuyển nó ra, cũng đã cố gắng đồng bộ hóa: thất bại, đồng bộ: thực hiện. Không thành công.

+0

Ghi đè lên 'Backbone.sync' rất khó, và có vẻ lạ khi gọi nó trực tiếp .. Tại sao bạn không sử dụng các lệnh lớp cao như' Model.fetch() '? – fguillen

Trả lời

4

Không phải bất kỳ sự kiện được kích hoạt bởi vì bạn đã không nói như vậy. Bạn đang chuyển các cuộc gọi lại successerror một cách rõ ràng, đó là những người phải chịu trách nhiệm kích hoạt các sự kiện.

Các mẹ đẻ Backbone.sync cuộc gọi từ các lớp cao lệnh như save, create, fetch nhận successerror callbacks những kích hoạt các sự kiện, nhưng bạn đang sử dụng riêng của bạn để hành vi tự nhiên này bị phòng ngừa.

Đối với example in the Model.save, in the Model.destroy v.v.

Nhưng, như tôi đã nói trong một nhận xét trước, bạn thực sự nên nghĩ rằng nếu bạn thực sự cần gọi trực tiếp Backbone.sync thay vì sử dụng các phương thức lớp cao hơn như Model.fetch().

2

Cố gắng thực hiện Backbone.sync như thế này:

var sync = Backbone.sync; 
Backbone.sync = function (method, model, options) { 
    var success = options.success; 
    options.success = function (resp, status, xhr) { 
     //Your logic goes here 
     console.log('succeed'); 
     if (success) success(resp, status, xhr); 
    }; 
    options.error = function (xhr, ajaxOptions, thrownError) { 
     console.log('failed'); 
    } 
    sync(method, model, options); 
};