2012-04-06 30 views
5

Để tìm hiểu về xương sống Im, hãy tạo một ứng dụng như Twitter. Vì vậy, bạn biết rằng Twitter sẽ gửi yêu cầu GET đến máy chủ cứ sau N giây để kiểm tra các tweet mới. Nếu có các tweet mới, nó sẽ tạo ra các thành phần ẩn li và hiển thị nút có "N Tweets mới". Nếu bạn nhấp vào nó, nó sẽ hiển thị các thành phần ẩn li, hiển thị các tweet mới. Nhưng hành vi sẽ khác khi bạn thêm một tweet mới: tweet hiển thị. Bạn không cần phải bấm vào nút để xem nó.Backbone collection.create() không trả về kiểu cập nhật

Tôi đã thực hiện phần đầu tiên, cho các tweet bị ẩn. Đối với phần đăng một tweet mới và hiển thị nó direclty, tôi nghĩ rằng nó sẽ được dễ dàng để làm bằng cách tạo ra các mô hình mới, gọi collection.create() và kích hoạt các sự kiện đúng, cái gì đó như:

var newTweet = new Tweet(); 
newTweet.set(/* set the attributes here. Some attributes are missing, because they are calculated server side */); 

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true }); // I choose silent=true because the add event on my collection is in charge of adding the new hidden tweets when there are new ones on the server 
this.collection.trigger("posted_new_tweet", created_tweet); 

Sau đó, , bộ sưu tập của tôi được đăng ký với sự kiện "posted_new_tweet", vì vậy mỗi lần người dùng đăng một tweet mới, một phương thức cụ thể của bộ sưu tập của tôi đang được gọi. Cách tiếp cận này đã hoạt động tốt cho đến khi tôi nhận được lỗi do biến created_comment được truyền trong trình kích hoạt: nó không phải là "hoàn thành". Tôi có nghĩa là mô hình có một số thuộc tính như "id" hoặc * "created_on" * chưa được xác định. Các thuộc tính này được tính toán phía máy chủ, nhưng tôi nghĩ rằng nếu tôi vượt qua wait = true, nó sẽ chờ và cập nhật mô hình của tôi với phản hồi được cung cấp bởi máy chủ (khi yêu cầu POST được gửi đến máy chủ, nó trả về mô hình mới được tạo ra trong json)

Mô hình của tôi có phải có thuộc tính phía máy chủ không? Đó có phải là cách tiếp cận đúng cho một điều như vậy không? Trong trường hợp nó không phải là, làm thế nào tôi có thể có 2 phương pháp khác nhau để hiển thị một bộ sưu tập xem?

Cảm ơn bạn!

Trả lời

14

create vẫn không đồng bộ ngay cả khi bạn vượt qua { wait: true }. Sự khác biệt là không có wait mô hình sẽ được thêm vào bộ sưu tập ngay lập tức trong khi với xương sống wait sẽ không thêm nó vào bộ sưu tập cho đến khi phản hồi thành công từ máy chủ.

Điều bạn cần làm là thêm gọi lại thành công vào create kích hoạt sự kiện khi phản hồi của máy chủ.

var created_tweet = this.collection.create(newTweet, { silent: true, wait: true, success: this.successCallback }); 

// Add successCallback as a method to the collection 
successCallback: function(collection, response) { 
    // I'm not 100% positive which values are passed to this function. Collection may actually be the new model. 
    this.collection.trigger("posted_new_tweet", created_tweet); 
} 
+0

Đúng vậy :) Cảm ơn bạn! – fiunchinho

+0

Tôi tin rằng trong các phiên bản sau của Backbone, các đối số bây giờ là 'nextModel' và' response'. – IanS

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