2013-03-09 42 views
8
loadMore: function(){ 
    var $this = this; 
    console.log(this.Messages); //SAME AS AFTER 
    this.Messages.url = '/js/messages/?start=' + this.Messages.length 
    this.Messages.fetch({'add':true, 
     success:function(){ 
      console.log($this.Messages); //SAME AS BEFORE?? 
     }, 
     error:function(){ 
     } 
    }); 
}, 

Bộ sưu tập không được cập nhật. Sau hàm này, các sự kiện được kích hoạt và các mục mới sẽ được vẽ trên màn hình. Vấn đề là bộ sưu tập không thêm các mô hình mới.Tìm nạp bộ sưu tập xương sống (thêm: đúng) không cập nhật bộ sưu tập

+0

Bạn đã xác minh rằng dữ liệu thực sự đang được trả về trong cuộc gọi nhận chưa? – kinakuta

+0

Bạn chỉ đang tìm kiếm các mô hình mới được thêm vào trong '$ this.Messages' trong lệnh gọi' success'? Nếu vậy, bạn có chắc chắn rằng, khi 'success' được gọi, bộ sưu tập đã phân tích cú pháp phản hồi và thêm chúng vào bộ sưu tập? –

Trả lời

0

Backbone.Collection.fetch():

fetch: function(options) { 
    options = options ? _.clone(options) : {}; 
    if (options.parse === void 0) options.parse = true; 
    var success = options.success; 
    options.success = function(collection, resp, options) { 
    var method = options.update ? 'update' : 'reset'; 
    collection[method](resp, options); 
    if (success) success(collection, resp, options); 
    }; 
    return this.sync('read', this, options); 
}, 

Vì vậy, có chuyện gì thế ở đây là, bạn thông qua chức năng được gán cho var succees.
collection[method](resp, options); Được gọi và trong trường hợp của bạn là 'reset'.
collection.reset phải trải qua và thêm tất cả các mô hình của bạn, kích hoạt tất cả các sự kiện trên đường đi. Tôi không biết chính xác những gì đang xảy ra nhưng nó đi qua collection.reset, collection.add, model.add, v.v ... Tôi đã không theo dõi tất cả.

Tôi không chắc chắn vấn đề chính xác là gì, tôi xin lỗi về điều đó. Tôi hy vọng tôi ít nhất có thể giúp bạn thử một số thứ để có thể chúng ta có thể đoán ra. Dòng if (success) success(collection, resp, options) là cuộc gọi đến hàm succes của bạn. Những gì bạn có thể thử làm là phải gọi lại thành công của bạn chấp nhận các đối số được truyền lại và làm một số an ủi của những người ra:

success: function(collection, resp, options) { 
    console.log(collection); // this might do the trick. 

    // if not, you could try the following 
    collection.on("reset", function(c, options) { 
    console.log(c); // see what that gives ya. 
    }); 
} 

Một điều nữa là, tôi không thể tìm thấy bất cứ nơi nào trong nguồn hoặc các tài liệu nơi collection.fetch có một tùy chọn thêm. Nếu tôi bỏ lỡ nó, xin vui lòng cho tôi biết tôi muốn nhìn nó qua.

Chúc bạn may mắn, hãy cho tôi biết những gì bạn tìm thấy. Nó có thể là giá trị trailing thông qua với một bước thông qua trình gỡ lỗi quá.

Chết tiệt, nó cũng đánh tôi rằng bảng điều khiển thường chỉ cho tôi phiên bản cập nhật nhất của các đối tượng bộ sưu tập khi không cần.

thử an ủi ra lenghts của các bộ sưu tập thay vì hoặc một cái gì đó:

var len = $this.Messages.length; 
console.log(len); 


//... 
// or in the success callback 
var len = collection.length; 
console.log(len); 
0

Backbone 1.0 loại bỏ tính năng này, phá vỡ mã mà phụ thuộc vào điều này:

http://backbonejs.org/#Collection-fetch

So sánh với:

"Nếu bạn muốn thêm các mô hình đến vào bộ sưu tập hiện tại, thay vì thay thế nội dung của bộ sưu tập, pas s {add: true} làm tùy chọn tìm nạp. "

http://htmlpreview.github.com/?https://raw.github.com/documentcloud/backbone/0.9.2/index.html#Collection-fetch

Tôi đề nghị quay trở lại phiên bản cũ của Backbone đến khi vấn đề này là cố định.

21

Như đã đề cập trong câu trả lời trước, tùy chọn add đã bị xóa trong phiên bản 1.0.0. Bạn có thể thực hiện điều tương tự bằng cách vượt qua remove: false để thay thế. Từ số docs:

Hành vi tìm nạp có thể được tùy chỉnh bằng cách sử dụng các tùy chọn sẵn có .Ví dụ, để lấy một bộ sưu tập, nhận được một "add" sự kiện cho mỗi mô hình mới, và một "thay đổi" sự kiện cho mỗi thay đổi mô hình hiện có, mà không loại bỏ bất cứ điều gì: collection.fetch({remove: false})

0

trong xương sống 1.0, bạn có để kích hoạt đặt lại bằng tay:

youColloection.fetch({reset: true}); 
Các vấn đề liên quan