2017-05-16 5 views
1

나는 게시물을위한 2 개의 출판물을 가지고있는 유성 앱을 가지고있다. 모든 게시물 하나와 추천 게시물을위한 하나. 두 개의 추천 게시물 - "Post 1"및 "Post 4"가 있습니다. 모든 페이지에 추천 게시물을 표시하고, 추천 게시물을 포함한 모든 게시물을 이름순으로 정렬합니다. 페이지 간을 이동하면 2 개의 발행물의 데이터가 섞여서 잘못된 결과가 표시됩니다. 다음과 같이겹쳐지는 유성 출판물

Template.hello.onCreated(function helloOnCreated() { 
    const instance = this; 
    instance.autorun(function() { 
    instance.subscribe('posts', FlowRouter.getParam('page')) 
    instance.subscribe('featured') 
    }); 
}); 

Template.hello.helpers({ 
    posts() { 
    return Posts.find({}, { 
     limit: 3, 
     sort: { 
     name: 1 
     } 
    }) 
    }, 
    featured_posts() { 
    return Posts.find({ 
     featured: true 
    }, { 
     sort: { 
     name: 1 
     } 
    }); 
    } 
}); 

HTML 템플릿은 2 개 루프에서 나는 모두에 가입하고 클라이언트에

Meteor.publish('posts', function(page) { 
    const skip = parseInt(page && page !== '' ? page : 0) * 3 
    return Posts.find({}, { 
    limit: 3, 
    skip, 
    sort: { 
     name: 1 
    } 
    }); 
}); 

Meteor.publish('featured', function() { 
    return Posts.find({ 
    featured: true 
    }, { 
    sort: { 
     name: 1 
    } 
    }); 
}); 

및 데이터를 표시 : 여기

코드입니다

<template name="hello"> 
    <h2>Featured</h2> 
    {{#each featured_posts}} 
    {{> post}} 
    {{/each}} 
    <h2>Posts</h2> 
    {{#each posts}} 
    {{> post}} 
    {{/each}} 
</template> 

문제는 2 개의 구독 정보가 화면에 겹쳐서 표시된다는 것입니다.

Page 1 

Featured 
    post 1 
    post 4 

All Posts 
    post 1 
    post 2 
    post 3 

을하지만 2 페이지

Page 2 

Featured 
    post 1 
    post 4 

All Posts -- Should be 
    post 1  post 4 
    post 4  post 5 
    post 5  post 6 

에 갈 때 "포스트 1"내부의 기능입니다 "게시물"그러나 shouldn '을 보여줍니다 : 1 페이지

이 올바르게 표시 나는 3 페이지에 가면 "게시물 1"과 "게시물 4"를 볼 수 있지만 거기에 있지 않아야합니다.

간행물이 데이터 집합을 병합하기 때문에 발행물 및 구독이 어떻게 작동하고 왜 발생하는지 이해합니다. 그들을 분리시켜 둘 수있는 방법이 있다면 궁금합니다.

답변

1

정확하게 이해하면 페이지가 "모든 게시물"목록의 페이지 매김에 해당합니다. "페이지"번호는 구독 매개 변수로 전송되므로 게시물의 짧은 목록을받을 수 있습니다.

어려움은 여기에 (당신이 당신의 'posts' 책에서 그들을 제한 때문에) 클라이언트 컬렉션 손에있는 모든 문서를하지 않는 것을 참, 그래서 당신이 책에서와 유사한 skip 논리를 사용할 수 없습니다.

유성 가이드>Paginating subscriptions에서 제안 된대로 percolate:find-from-publication 대기 패키지를 사용하면 'posts' 출판물의 문서 만 쉽게 검색 할 수 있습니다.

// Server 
FindFromPublication.publish('posts', function(page) { 
    // Same logic 
    const skip = parseInt(page && page !== '' ? page : 0) * 3 
    return Posts.find({}, { 
    limit: 3, 
    skip, 
    sort: { 
     name: 1 
    } 
    }); 
}); 

// Client (no change in subscription) 
Template.hello.helpers({ 
    posts() { 
     return Posts.findFromPublication('posts', {}, { 
     sort: { 
      name: 1 
     } 
     }); 
    } // (no change in featured_posts) 
}); 
1

나는 데이터가 클라이언트에 고립 될 수있다 게시 너무 observe or observeChanges를 사용하는 것이 좋습니다 것입니다. 문서는 위협적 일 수 있지만 실제로 보이는 것보다 쉽습니다.

특별한 클라이언트 측 컬렉션을 만든 다음 observe 콜백에서 해당 컬렉션의 이름을 사용하는 것만 큼 문제가됩니다. 클라이언트 측 컬렉션 이름은 "featured_posts"이 게시에 self.added, self.changedself.removed에 호출에 사용되는 것을 알 :

// client-side 
const FeaturedPosts = new Mongo.Collection('featured_posts', { 
    defineMutationMethods: false 
}); 

// server-side 
Meteor.publish('featured', function() { 
    const self = this; 

    const handle = collection.find(selector, opts).observe({ 
     added: function(doc) { 
     self.added('featured_posts', doc._id, doc); 
     }, 

     changed: function(newDoc, oldDoc) { 
     self.changed('featured_posts', newDoc._id, newDoc); 
     }, 

     removed: function(doc) { 
     self.removed('featured_posts', doc._id); 
     }, 
    }); 

    self.ready(); 

    self.onStop(function(err) { 
     if (!err) { 
     handle.stop(); 
     } 
    }); 
    }); 
}; 
+0

가 수집 도우미와 함께이 일을합니까? – Addy

+0

컬렉션 헬퍼를 사용하지 않고 변환 함수를 등록한다고 가정 할 때 변환 함수가 작동하는 모든 곳, 즉 '관찰'을 사용하면 작동 할 것이라고 기대할 수 있습니다. docs에서 "변환은 observeChanges의 콜백 또는 게시 함수에서 반환 된 커서에 적용되지 않습니다." –

+1

또한 ... 콜렉션에서 필요한 모든 사용자 정의 논리를 수행 할 수 있다는 것을 명심하십시오. 다른 콜렉션의 데이터에 "조인"해야하는 경우. 또한 변환 함수를 전달하여/findOne을 찾아 컬렉션 수준 변환을 무시할 수 있습니다. –