2013-02-11 2 views
5

서버 측의 변경 사항을 고객에게 알릴 필요가 있습니다. 내 경우 서버와 클라이언트에서 서로 다른 컬렉션을 사용하고 있습니다 (자세한 내용은 how would you build pinterest like page with meteor.js).컬렉션을 사용하지 않는 서버에서 모든 클라이언트로 데이터를 푸시하는 방법은 무엇입니까?

서버에서 외부 API로부터 새 제품을 얻고 있습니다. 모든 클라이언트에게 레이아웃이 잘 작동하는 데 필요한 로컬 변수를 업데이트 할 수있는 새 항목 수를 게시하고 싶습니다. 어떻게 수행하나요?

Meteor.Collection보다 다른 종류의 데이터를 게시/구독 할 수 있으면 좋을 것입니다. Meteor.deps를 찾았지만 클라이언트 측에서만 작동합니다.

+0

여기에 자세한 답변이 포함 된 최신 게시물이 있습니다. http://stackoverflow.com/questions/18584757/ –

답변

2

원하는대로 수행하려면 클라이언트에서 다른 컬렉션이 필요합니다. 서버의 게시 기능에서 처음부터 문서를 작성하여 현재 제품 수를 특성에 할당합니다. observe() 및 set을 사용하여 문서가 문서에 추가되거나 제거 될 때 count을 수정하십시오. 클라이언트의 count "레코드 세트"를 구독하십시오.

// 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

아주 좋은 속임수 - 나 또한 무슨 일이 일어나는지 이해할 수있는 기본 사항을 제공하는 ddp 프로토콜에 대한 eventedmind 자습서를 살펴볼 것을 권합니다. : http://www.eventedmind.com/posts/meteor-subscriptions-and-ddp – sarfata

0

위의 해결 방법은 나에게 하나의 방법을 보여줬지만, 여전히 observe()와 연결되지 않은 클라이언트 데이터를 게시해야한다면 어떻게해야합니까? 아니면 어떤 컬렉션?

제 경우에는 제품이 1000 개입니다. 방문객을 끌어 들이기 위해 난수를 곱한 타임 스탬프를 업데이트하고 타임 스탬프별로 컬렉션을 표시하여 컬렉션을 "새로 고침"했습니다. 이 방문자에게 뭔가 일이 일어나고 있다는 인상을 주셔서 감사합니다.

refresh 메서드는 제품 수 (임의 수)를 반환합니다. 그 번호를 모든 고객에게 전달해야합니다. 나는 그것을했지만 추악한 해결 방법을 사용했다.

refresh 방법 세트 Session.set('lastRandomNo', random). BTW : Session이 서버 측에서 작동하는지 몰랐습니다. refresh 업데이트 제품 컬렉션.

그리고 위의 대답에 accoriding :

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() 

및 클라이언트 측

가 :

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 

당신은 어떻게 생각하세요?

관련 문제