2014-11-13 16 views
7
Tweets = new Meteor.Collection('tweets'); 

if (Meteor.isClient) { 

    Meteor.subscribe('tweets'); 

    Template.Panel.helpers({ 
    items: function() { 
     var days_tweets = Tweets.find(); 
     console.log(days_tweets.count()); 
     return days_tweets; 
    }); 
    } 

if (Meteor.isServer) { 
    Meteor.publish('tweets', function() { 
    return Tweets.find({}, {limit: 1000}); 
    }); 

Mẫu:Meteor helper gọi nhiều lần bằng mẫu đơn biến

<body> 
<h1>This is a list of tweets</h1> 
    {{> Panel}} 
</body> 

<template name="Panel"> 
<h2>A list of tweets sorted by size</h2> 
    {{#each items}} 
     <p>item</p> 
    {{/each}} 
</template> 

Và giao diện điều khiển đầu ra khi tải trang:

Tweet count: 0 
Tweet count: 129 
Tweet count: 272 
Tweet count: 366 
Tweet count: 457 
Tweet count: 547 
Tweet count: 672 
Tweet count: 814 
Tweet count: 941 
Tweet count: 1000 

Vì vậy, các chức năng helper bắn 10 lần trên trang tải (số lần thay đổi). Bất cứ ai có thể giải thích những gì đang xảy ra ở đây? Tôi không thể tìm thấy bất kỳ tham chiếu nào về điều này, chấp nhận trong các tình huống mà trình trợ giúp được gọi từ nhiều {{}} trên mẫu. Ngoài ra bất kỳ cách nào để ngăn chặn nó? Cuối cùng tôi cần phải xử lý các tweet trong một lần trước khi chúng được trả lại.

Trả lời

7

Khi bạn thực hiện một sao băng tìm thấy đăng ký một sự phụ thuộc cho trợ giúp mẫu đó trên bộ sưu tập bạn đã tìm thấy trên. Bởi vì thiên thạch phụ thuộc đó sẽ gọi trình trợ giúp mẫu cho mọi sửa đổi đối với bộ sưu tập.

Nếu bạn chưa đăng ký, không có dữ liệu nào được tải trong bản sao phía máy khách của bộ sưu tập mongo của bạn. Chỉ khi bạn gọi đăng ký, meteor sẽ bắt đầu lấy dữ liệu từ máy chủ.

Vì vậy, phương thức được gọi nhiều lần vì đăng ký tiếp tục chèn tài liệu mới vào bản sao cục bộ của bộ sưu tập mongo, kích hoạt các cuộc gọi mới tới trình trợ giúp mẫu.

Mẫu tốt nhất để chống lại bất kỳ vấn đề nào mà điều này có thể cung cấp là bằng cách đăng ký người trợ giúp và sử dụng phương thức sẵn sàng trên đăng ký documentation. Sẵn sàng cũng là phản ứng nên khi tất cả dữ liệu được kéo vào sẵn sàng sẽ được thay đổi thành true và helper sẽ được gọi lại.

Template.Panel.helpers({ 
     items: function() { 
      var ready = Meteor.subscribe('tweets').ready(); 
      var days_tweets = Tweets.find(); 

      return { 
       data: days_tweets, 
       ready: ready 
      }; 
     }); 
    } 

Mẫu thân:

{{#with items}} 
    {{#if ready}} 
     {{#each data}} 
      <p>item</p> 
     {{/each}} 
    {{else}} 
     Show a spinner or whatever 
    {{/if}} 
{{/with}} 
+0

Ok cảm ơn. Tôi giả định một cái gì đó như thế này. Có cách nào để ngăn chặn nó làm điều này? (giả sử bộ sưu tập trên máy chủ không thay đổi, đây là trường hợp ở đây). Có vẻ lạ khi có đồng bộ hóa giữa máy chủ cố định và bộ sưu tập máy khách đang chạy loại không đồng bộ. – kendlete

+0

@kendlete đã cập nhật câu trả lời của tôi với ví dụ về cách làm việc với hành vi của hệ thống đăng ký của thiên thạch –

+0

'Meteor.subscribe()' cũng có một cuộc gọi lại trong tài liệu, có thể được sử dụng để trì hoãn việc chèn thêm mã cho đến khi đăng ký sẳn sàng. Đó là khác với .ready() trả về một boolean nếu thuê bao đã sẵn sàng. Hơi cồng kềnh hơn, có lẽ, hơn là cách tiếp cận của Marco. – Paul

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