2016-07-11 12 views
1

Also habe ich einen Winkel-Controller mit einer Meteor-Helfer-Methode, wie unten.Wie gehe ich mit Werten um, die vom Ergebnis eines Helfers abhängen?

function localeCtrl($scope, $reactive, $stateParams{ 
    $reactive(this).attach($scope); 
    var self = this; 
    self.helpers({ 
     locale: function(){ return Locales.findOne($stateParams.id)}, 
     staff: function(){ 
      // Load data from second collection based on current Locale. 
      // But how? 
     }, 
     address: function(){ 
      // Take self.location.address and massage it to provide 
      // google maps link. How? 
     } 
     tags: function(){ 
      // Collect all unique instances of a given tag by 
      // iterating over the available locales. 
      // E. G. If 10 locales have the 'restaurant' tag, and 5 
      // more have the 'library' tag, I want an array of 
      // ['restaurant', 'library'] -- easy enough to do 
      // by iterating over the locales, but how do I do that 
      // reactively? 
     } 
    }); 
} 

Leider muss ich auf den von locale abgerufenen Daten basierend zusätzliche Eigenschaften festlegen(). Ich kann sie nicht einrichten, wenn ich den Controller initialisiere, da sich der Wert in locale() ändert, wenn Daten vom Server abgerufen werden. Aber ich brauche Zugriff auf die Daten im Gebietsschema, um z. B. die Google Maps-Adresse zu erstellen oder verknüpfte Datensätze abzurufen. (Sie sind nicht in das Gebietsschema-Dokument eingebettet, aus Gründen, die zu der Zeit sicherlich sinnvoll waren).

Edit:

Zusätzlich verwende ich Boden DB eine lokale Kopie der Daten für die Offline-Zugriff zu speichern, die das Leben macht noch komplizierter.

Antwort

1

Wahrscheinlich ist es am besten, wenn Sie Ihre Sammlung mit publishComposite veröffentlichen, die mit dem reywood:publish-composite-Paket implementiert wird.

Fügen Sie das Paket:

meteor add reywood:publish-composite 

Jetzt, wo Sie die Locales Sammlung veröffentlichen Sie so etwas tun würde:

Meteor.publishComposite('locales', function() { 
return { 
    find() { 
     //Put whatever you need in the query for locales 
     const query = { 
     _userId: this.userId 
     }; 


     return Locales.find(query); 
    }, 

    children: [{ 
     find(locale) { 
     return Staff.find({ localeId: locale._id }); 
     } 
    }] 
    }; 
}); 

Dann in Ihrem Controller vor dem Helfer Sie hinzufügen:

this.subscribe('locales'); 

Jetzt sollten Sie in der Lage sein, den Code einfach wie folgt zu rufen:

this.helpers({ 
     locale(){ 
      return Locales.findOne(this.$stateParams.id); 
     } 
    }); 

Und es Zugang in der Vorlage wie folgt aus:

locale.staff 

geben, dass ein Versuch und lassen Sie es mich wissen!

+0

Leider ist ein Teil der Schlüssellogik rückwärts. (Tadeln Sie mich nicht, ich kam spät in der Entwicklung). Mitarbeiter-IDs werden in der Ländereinstellung gespeichert. (Edit: Ich denke, ich sehe, wie ich mich jetzt darauf einstellen muss, beim zweiten Lesen) Ein weiteres Problem ist, dass ich die Boden-DB für einen Offline-Modus verwende und ich bin mir nicht sicher, ob das mit dem übereinstimmt, was du vorschlägst. Wir werden sehen, wie es funktioniert, sobald ich ein paar andere Dinge repariere. – RonLugge

+0

Außerdem fügte ich ein zusätzliches Anwendungsbeispiel hinzu, das von Ihrem Ratschlag abgedeckt wird. Sollte so einfach sein wie eine "Kinder" -Methode, die nur die Logik hat, die die Transformation abdeckt, denke ich ... oder? – RonLugge

+0

Ich denke, Sie sollten in der Lage sein, eine weitere Kinderkollektion hinzuzufügen und sie einfach so zu referenzieren, wie Sie es bei den Mitarbeitern tun würden. Ich würde mir die Dokumente der Links ansehen, auf die ich verwiesen habe, um sicher zu gehen. Es klingt wie du bist auf dem richtigen Weg. :) – Erick