2013-08-19 1 views
1

지도에서 마커를 표시하려는 프로젝트에서 작업 중입니다.Publications 구독 관찰 Observe

이러한 마커는 뷰포트 제약 조건이있는 서버에서 게시해야합니다. 즉, 현재 사용자 뷰포트 안에있는 마커 만 게시됩니다.

//server 
Meteor.publish('posts', function(bottom_left_x, bottom_left_y, upper_right_x, upper_right_y, limit) { 

    return Posts.find({locs: {$geoWithin: {$box: 
            [[bottom_left_x, bottom_left_y], 
            [upper_right_x, upper_right_y]]}}}, 
         {sort: {submitted: -1}, limit: limit}); 
}); 

난 항상 내 map_center 변경 가입시를 통해이 함수를 호출 : : 이제 모든 것이 잘 작동

//client 
google.maps.event.addListener(map, 'idle', function(event) { 
    var bounds = map.getBounds(); 

    var ne = bounds.getNorthEast(); 
    var sw = bounds.getSouthWest(); 
    postsHandle= Meteor.subscribe('posts', sw.lat(), sw.lng(), ne.lat(), ne.lng(), 10); 
}); 

까지

간행물은 다음과 같이 보인다. 또한 "posts"에 대한 관찰 함수를 만들었습니다. "added"가 호출되면 마커를 렌더링하고 "removed"가 호출되면 제거합니다. 관찰은 새로운 마커를 렌더링하고 그 문제가 관찰 - 콜백 전체 게시물-컬렉션 트리거이다 오래 된 것

//client 
Posts.find().observeChanges({ 
    added: function(post) { 
    // when 'added' callback fires, add HTML element 
    var marker = new google.maps.Marker({ 
     position: new google.maps.LatLng(post.locs.lat, post.locs.lng), 
     postId: post._id, 
     map: map, 
    }); 
},removed .... and so on 

을 파괴하는 매우 좋다. 하지만 난 단지 사용자 뷰포트 안에있는 마커를 보여주고 싶습니다. 그게 내가 보통 다음과 같이해야만하는 이유입니다.

//client 
Posts.find({locs: {$geoWithin: {$box: 
            [[bottom_left_x, bottom_left_y], 
            [upper_right_x, upper_right_y]]}}}, 
         {sort: {submitted: -1}, limit: limit}).observeChanges({ 

하지만 그건 불가능합니다. GeoWithin은 minimongo에서 지원되지 않으므로 제한이있는 콜렉션을 사용하여 oberserve를 호출 할 수 없습니다.

누구에게이 작업을 수행 할 생각이 있습니까? 아마 minimongo에 대한 쿼리를 사용하지 않고 서브 스크립 션에서 직접지도로 가져 오는 게시물을 푸시 할 수있는 방법이 있습니까?

+0

이 필터링을 서버 측에서 수행하고 클라이언트에서 구독하는 방법은 어떻습니까? 어떻게 든 경계를 보내야 할 것입니다. 음 ... 작동하지 않을 수 있습니다. –

+0

나는 이미 서버 측에 펄스를 가지고 있으며 내 뷰포트가 변경 될 때마다 호출됩니다. 예를 들어 viewport_1에는 3 개의 마커가 있고 viewport_2는 내 posts보다 2 개의 제조사를 제공합니다. 클라이언트 측 콜렉션에는 5 개의 마커가 있습니다. 그게 왜 내가 minimongo 통해 쿼리를 할 필요가있다. 그러나 minimongo는 필요한 매개 변수를 제공하지 않습니다. – chaosbohne

답변

1

솔루션은 매우 쉽습니다!

Meteor.autosubscribe(function() { 
    Meteor.subscribe('chat', { room: Session.get('currentRoom') }); 
}); 

뷰포트 경계를 변경하여지도 뷰포트에 대한 가입을 제한하려면 자동 가입을 사용해야합니다. 자동 가입이 구독 인수 변경에 도움이되는 것 같습니다.

Meteor.autosubscribe(function() { 
    var a = Session.get('bounds'); 
    if(a) 
    Meteor.subscribe('posts', a.swlat, a.swlng, a.nelat, a.nelng, 5); 
});