SORU
7 Kasım 2013, PERŞEMBE


Anlayış Meteor / Abone Yayınlamak

Basit bir uygulama Projelerin listesini gösterir hazırladım. Müşteri için her şeyi gönderiyorum, böylece autopublish paketi çıkardım.

 <template name="projectsIndex">    
   {{#each projects}}      
     {{name}}
   {{/each}}
 </template>

Autopublsh açıldığında, bu tüm projeleri görüntüler:

if Meteor.isClient
  Template.projectsIndex.projects = Projects.find()

Kaldırıldı, ayrıca yapmam gereken:

 if Meteor.isServer
   Meteor.publish "projects", ->
     Projects.find()
 if Meteor.isClient
   Meteor.subscribe "projects"
   Template.projectsIndex.projects = Projects.find()

İstemci tarafı bulmak olduğunu söylemek doğru olur() yöntemi, yalnızca sunucu tarafında yayımlanmış olan kayıtları arar? Sadece arayıp bulmak zorundaymışım gibi hissettim, çünkü benimle uğraşmaktan oldu() bir kez.

CEVAP
18 ŞUBAT 2014, Salı


Koleksiyon, yayınlar ve abonelikleri zor bir alan Meteor, belgelere olabilir tartışmak daha fazla ayrıntı için önlemek frequent confusionhangi bazen güçlendirilmiş confusing terminology.

Burada Sacha Greif (DiscoverMeteor ortak yazar) bir slayt yayınlar ve abonelikleri açıklama:

enter image description here

Düzgün find() daha aramak gerek anlamak için, koleksiyon, yayınlar ve abonelikleri Meteor nasıl çalıştığını anlamak gerekir bir kez

  1. Sen MongoDB koleksiyonlar tanımlamak. Meteor henüz dahil. Bu koleksiyonu içerirdatabase records(aynı zamanda sözde "belgeleri" her iki Mongo and Meteor ama bir "belge" daha genel anlamda bir veritabanı kaydı; örneğin, bir güncelleştirme belirtimi veya sorgu seçici olan belgeler too - JavaScript nesneleri içeren field: value çift).

  2. Sonra 50 ** tanımlayınMeteor sunucudaile

    MyCollection = new Mongo.Collection('collection-name-in-mongo')
    

    Bu koleksiyonu içerirtümbu MongoDB veri derlemeleri, ve geri dönmeyecek onlara MyCollection.find({...}) çalıştırabilirsinizcursor(bunların arasında dolaşmak ve onları geri dönmek için yöntemler ile kayıtları bir dizi).

  3. Bu imleç (çoğu zaman) kullanılırpublish(gönder) kayıtları (denir . kümesi >"" . rekor ^güçlü ). İsteğe bağlı olarak sadece yayımlamaksomebu kayıtlardan alanları. Rekoru kırdı onudeğilkoleksiyon) istemcilersubscribeiçin. Yayın yapılan bir publish function, çalıştırmak her zaman yeni bir müşteri abone ve alabileceği parametreler için yönetmek kayıtları dönmek (örneğin, kullanıcı kimliği, geri dönmek sadece kullanıcı belgeleri).

  4. İstemci üzerinde, Minimongo koleksiyonları varkısmenaynabazısunucu kayıtları. "Kısmen" çünkü onlar içerebilir sadece bazı alanlar, "bazı kayıtlar" çünkü genellikle istiyorsun göndermek için istemci kayıtları lazım, hızlı sayfa yükleme ve yalnızca ihtiyacı varveerişme izni vardır.

    Minimongo aslında saf JavaScript bellek, kalıcı olmayan uygulama Mongo. Bu istemci ile çalıştığından sadece veritabanı alt depolandığı yerel bir önbellek olarak hizmet vermektedir. Müşteri bulmak () sorguları bu önbellek dışında doğrudan, sunucu danışmadan servis edilir.

    Bu Minimongo koleksiyonları başlangıçta boş. Tarafından doldurulur

    Meteor.subscribe('record-set-name')
    

    çağırır. 57* *parametre koleksiyon adı değil; bir adı olduğunu unutmayınkayıt kümesisunucu publish çağrı kullanılır. subscribe() çağrı bir istemci abone olurkayıt kümesi- bir alt kayıtlarından sunucu koleksiyonu (örneğin, en son 100 blog), ya da bir alt alanlarında her kayıt (örneğin sadece title date). Nasıl Minimongo gelen kayıtları yer için biliyor mu? Adı toplanması olacak collection değişken kullanılan yayınlamak terbiyecisi added, changed removed geri aramaları, ya da eğer bunlar eksik (ki bu durum çoğu zaman) olacak adı MongoDB koleksiyonu server.

Değiştirme kayıtları

Burada Meteor yapan şeyler çok rahat: zaman, değişiklik kaydı (belge) Minimongo koleksiyonu istemci, Meteor anında güncelleme tüm şablonlar buna bağlı, ve de değişiklikleri geri göndermek için sunucu, dönecek deposu değişiklikler MongoDB ve gönderir onlara uygun istemciler bu abone için bir rekor da dahil olmak üzere belge. Bu denirgecikme tazminatve seven core principles of Meteor biridir.

Birden fazla abonelik

Bir demet abonelikleri Çek farklı kayıtları, ama hepsinin sonu aynı koleksiyonu istemci geldi aynı koleksiyonu, sunucu tabanlı kendi _id. Bu açıkça anlattım ama Meteor doktorlar tarafından açık değildir

Rekor abone olduğunuzda, sunucu istemciye kayıtları göndermek için söyler. İstemci collection bağımsız değişken olarak aynı adı kullanılır added, changed removed geri işleyicisi yayınlamak ile yerel Minimongo koleksiyonlarında bu kayıtları saklar. Meteor Mongo bildirmek kadar gelen öznitelikleri sıra.İstemci koleksiyonu eşleşen koleksiyonu adı ile.

İzah değil ne zaman oluyoryokaçıkça çoğu zaman olan added, changed removed veya işleyicileri hiç Yayımla - kullanın. En sık görülen bu durumda, tahsilat argüman (şaşırtıcı) Adım 1 sunucusunda ilan MongoDB koleksiyonun adı alınır. Ama bunun anlamı, farklı yayın ve farklı isimlerle abonelikleri olabilir ve tüm kayıtları müşteri aynı koleksiyon içinde sona erecek. Aşağı seviye alanları, Meteor bakıyor gerçekleştirmek için bir dizi sendika arasında belgeler, bu tür abonelikleri örtüşüyor - yayınlama işlevleri bu gemi farklı alanlar için istemci iş yan yana ve istemci, belge koleksiyonu olacak union of the two sets of fields.

Örnek: birden fazla abonelik müşteri aynı toplama doldurma

Farklı şeyler olsa bile sunucu hem de istemci üzerinde aynı şekilde ilan BlogPosts bir koleksiyonu vardır,:

BlogPosts = new Mongo.Collection('posts');

İstemci, BlogPosts kayıtlardan elde edilebilir.:

  1. en son 10 günlüğü gönderileri için bir abonelik

    // server
    Meteor.publish('posts-recent', function publishFunction() {
      return BlogPosts.find({}, {sort: {date: -1}, limit: 10});
    }
    // client
    Meteor.subscribe('posts-recent');
    
  2. geçerli kullanıcı bu mesaj için bir abonelik

    // server
    Meteor.publish('posts-current-user', function publishFunction() {
      return BlogPosts.find({author: this.userId}, {sort: {date: -1}, limit: 10});
      // this.userId is provided by Meteor - http://docs.meteor.com/#publish_userId
    }
    Meteor.publish('posts-by-user', function publishFunction(who) {
      return BlogPosts.find({authorId: who._id}, {sort: {date: -1}, limit: 10});
    }
    
    // client
    Meteor.subscribe('posts-current-user');
    Meteor.subscribe('posts-by-user', someUser);
    
  3. en popüler mesajlar için bir abonelik

  4. vb.

Tüm bu belgeler sunucuda BlogPosts koleksiyonu ile MongoDB posts tahsilat, gelir, ve sonunda istemci BlogPosts koleksiyon.

Şimdi anlıyorum neden araman gerek find() daha sonra ikinci kez olmak istemcisi, çünkü belgeler tüm abonelikleri olacak sonunda aynı toplama ve ihtiyacınız almak için sadece bu önemsiyorsunuz. Örneğin, istemci, en son gönderilen iletileri almak için yapmanız gereken tek şey sunucu sorguyu ayna:

var recentPosts = BlogPosts.find({}, {sort: {date: -1}, limit: 10});

Bu istemci şimdiye kadar aldığı kayıtları/tüm belgelerin bir imleç, hem de üst düzey mevkilere ve Kullanıcının iletilerini döndürür. (thanks Geoffrey).

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • Gimpology.com Video Tutorials

    Gimpology.co

    3 ŞUBAT 2008
  • Truc Minh

    Truc Minh

    23 Ocak 2011