2013-02-17 28 views
10

Tôi ràng buộc vào sự kiện thay đổi của các mô hình xương sống của tôi như thế này.Làm thế nào để biết khi nào một Backbone model.fetch() hoàn thành?

this.model.on("change", this.render, this); 

Đôi khi tôi muốn tìm nạp phiên bản mới nhất của mô hình và buộc hiển thị chế độ xem. Vì vậy, tôi làm điều này

this.model.fetch(); 

Thật không may model.fetch() chỉ kích hoạt sự kiện thay đổi nếu dữ liệu mới khác với dữ liệu đã lưu trước đó trong mô hình.

Làm cách nào để luôn kích hoạt cuộc gọi lại này.Khi hoàn tất tìm nạp, cho dù nó kích hoạt sự kiện thay đổi hay không?

Cảm ơn (trước) để được giúp đỡ của bạn

Trả lời

11

Bạn có thể sử dụng số gọi lại thành công $.ajax nhưng bạn cũng có thể chỉ nghe các sự kiện Backbone syncerror trên mô hình. sync kích hoạt sau khi cuộc gọi thành công đến máy chủ, error kích hoạt sau khi cuộc gọi không thành công đến máy chủ.

this.model.on('sync', this.render, this); 
this.model.on('error', this.handleError, this); 
1

Phương pháp fetch tùy chọn có thể chấp nhận có sự thành công và lỗi callbacks; giải pháp đơn giản nhất là đặt bạn xem render trong gọi lại thành công. Bạn cũng có thể sử dụng lời hứa jqXHR trả về, nhưng nếu có trường hợp AJAX sẽ thành công (theo jQuery) nhưng khởi tạo mô hình không thành công, việc sử dụng đó có thể có vấn đề.

1

Tôi không biết là những gì cấu trúc mã của bạn, tuy nhiên nếu bạn đang lấy mô hình của bạn bên trong cái nhìn của bạn, bạn có thể sử dụng một cái gì đó như thế này

var that = this; 
this.model.fetch().done(function() { 
    that.render(); 
}); 

khác, nếu bạn đang lấy mô hình của bạn ngoài tầm nhìn của bạn, bạn có thể vượt qua lời hứa của bạn để xem bạn và làm cho một cái gì đó tương tự

var promise = model.fetch(); 
// other code here 
var view = new View({ 
    model: model, 
    promise: promise 
}); 

và bên trong cái nhìn của bạn, ví dụ như trong initialize

View = Backbone.View.extend({ 
    initialize: function(){ 
     this.options.promise.done(function() { 
      // your code here 
     }); 
    } 
}); 
1

Làm thế nào về giải pháp này:

// emit fetch:error, fetch:success, fetch:complete, and fetch:start events 
fetch: function(options) { 
    var _this = this; 

    options = options || {}; 

    var error = options.error; 
    var success = options.success; 
    var complete = options.complete; 

    options.error = function(xhr, textStatus, errorThrown) { 
    _this.trigger('fetch:error'); 
    if (error) error(xhr, textStatus, errorThrown); 
    }; 

    options.success = function(resp) { 
    _this.trigger('fetch:success'); 
    if (success) success.call(options.context, resp); 
    }; 

    options.complete = function() { 
    _this.trigger('fetch:complete'); 
    if (complete) complete(); 
    }; 

    _this.trigger('fetch:start'); 

    return Backbone.Model.prototype.fetch.call(this, options); 
} 

Liên kết với GIST https://gist.github.com/fedyk/23761ce1236c5673fb84

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