2013-02-11 19 views
5

Tôi cần thông báo cho khách hàng về những thay đổi ở phía máy chủ. Trong trường hợp của tôi, tôi đang sử dụng các Bộ sưu tập khác nhau trên máy chủ và trên máy khách (thêm về nó trong câu hỏi này: how would you build pinterest like page with meteor.js).Làm cách nào để đẩy dữ liệu từ máy chủ đến tất cả các máy khách không sử dụng Bộ sưu tập?

Trên máy chủ, tôi nhận được Sản phẩm mới từ API bên ngoài. Tôi muốn xuất bản số lượng mục mới cho tất cả các khách hàng mà họ có thể cập nhật các biến cục bộ của họ cần thiết để bố cục hoạt động tốt. Cách thực hiện?

Thật tuyệt nếu tôi có thể xuất bản/đăng ký các loại dữ liệu khác với Meteor.Collection. Tôi tìm thấy Meteor.deps, nhưng những gì tôi hiểu nó chỉ hoạt động ở phía khách hàng.

+0

Có một bài đăng mới hơn với các câu trả lời chi tiết tại đây: http://stackoverflow.com/questions/18584757/ –

Trả lời

2

Để thực hiện những gì bạn muốn, bạn cần một bộ sưu tập khác - trên máy khách. Trên máy chủ, trong một hàm xuất bản, hãy xây dựng một tài liệu từ đầu chỉ định số lượng Sản phẩm hiện tại cho một thuộc tính. Sử dụng quan sát() và thiết lập, sửa đổi count khi tài liệu được thêm hoặc xóa khỏi Sản phẩm. Đăng ký count "bộ bản ghi" trên máy khách.

// Server 
Meteor.publish('count', function() { 
    // Build a document from scratch 
    var self = this; 
    var uuid = Meteor.uuid(); 
    var count = Products.find().count(); 
    // Assign initial Products count to document attribute 
    self.set('count', uuid, {count: count}); 

    // Observe Products for additions and removals 
    var handle = Products.find().observe({ 
     added: function (doc, idx) { 
      count++; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     }, 
     removed: function (doc, idx) { 
      count--; 
      self.set('counts', uuid, {count: count}); 
      self.flush(); 
     } 
    }); 
    self.complete(); 
    self.flush(); 
    self.onStop(function() { 
     handle.stop(); 
    }); 
}); 

// Client 
Counts = new Meteor.Collection('count'); 
Meteor.subscribe('count'); 
console.log('Count: ' + Counts.findOne().count); 
+1

Thủ thuật rất hay - Tôi cũng khuyên bạn nên xem hướng dẫn eventedmind trên giao thức ddp cung cấp một số khái niệm cơ bản để hiểu những gì đang diễn ra : http://www.eventedmind.com/posts/meteor-subscriptions-and-ddp – sarfata

0

Tôi phải nói giải pháp trên cho tôi thấy một cách, nhưng vẫn còn, nếu tôi cần xuất bản cho dữ liệu khách hàng không được kết nối với quan sát()? Hoặc với bất kỳ bộ sưu tập nào?

Trong trường hợp của tôi, tôi có 1.000 sản phẩm. Để thu hút khách truy cập, tôi đang "refreshig" bộ sưu tập bằng cách cập nhật dấu thời gian của số lượng sản phẩm ngẫu nhiên và hiển thị bộ sưu tập được sắp xếp theo dấu thời gian. Cảm ơn khách truy cập này có ấn tượng rằng có điều gì đó đang xảy ra.

Phương thức refresh của tôi trả về số lượng sản phẩm (nó là ngẫu nhiên). Tôi cần chuyển số đó cho tất cả khách hàng. Tôi đã làm nó, nhưng sử dụng (tôi nghĩ) workaround xấu xí.

My refresh phương thức đặt Session.set('lastRandomNo', random). BTW: Tôi không biết rằng phiên làm việc trên phía máy chủ. refresh cập nhật Bộ sưu tập sản phẩm.

Sau đó accoriding để trả lời ở trên:

Meteor.publish 'refreshedProducts', -> 

self = this 
uuid = Meteor.uuid() 

# create a new collection to pass ProductsMeta data 
self.set('products_meta', uuid, { refreshedNo: 0 }) 

handle = Products.find().observe 
    changed: (newDocument, atIndex, oldDocument) -> 
    self.set('products_meta', uuid, { refreshedNo: Session.get('lastRandomNo') }) 
    self.flush() 

self.complete() 
self.flush() 
self.onStop -> 
    handle.stop() 

và đứng về phía khách hàng:

ProductsMeta = new Meteor.Collection('products_meta') 

# subscribe to server 'products_meta' collection that is generated by server 
Meteor.subscribe('refreshedProducts') 

ProductsMeta.find({}).observe 
    changed: (newDocument, atIndex, oldDocument) -> 

    # I have access to refreshedNo by 
    console.log ProductsMeta.findOne().refreshedNo 

Bạn nghĩ gì?

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