2016-11-28 2 views
0

Ich habe 4 speichert für einen Stapel-Überlauf Beispiel:MobX - Mehrere Filialarrays gleichzeitig aktualisieren?

SearchQuestionsStore 
RecentQuestionsStore 
UserQuestionsStore 
CurrentQuestionStore 

eine Jede der ersten 3 speichert haben @observable questionsList = [];

Eine Frage, aus diesen 3 speichert zugegriffen werden kann, wenn die questionsList mit bevölkert Fragen. Ein @observable currentQuestion hält die aktuell ausgewählte Frage in der CurrentQuestionStore

Wenn ein Benutzer die currentQuestion upvotes wir einfach die aktuelle Frage des Grafen erhöhen CurrentQuestionStore.currentQuestion.upvotes++ verwenden, aber dies nicht die letzte upvote Zahl in den anderen 3 speichert reflektieren.

Das Problem ist, dass die Frage möglicherweise in keinem der anderen 3 Läden questionlists existiert, also habe ich mich gefragt, was wäre der beste Weg, dies mit MobX zu nähern? So können wir die neueste Zählung für diese questionId = 1 über alle Filialen aktualisieren, wenn sie existieren. Die gleiche Situation tritt auf, wenn Sie den Titel, die Anzahl der Antworten oder ein anderes Attribut ändern. Was ist die beste Möglichkeit, um die Änderungen von Attributänderungen in den Filialen gleichzeitig widerzuspiegeln?

+1

Haben Sie versucht, nur einen 'QuestionStore' für alle Fragen zu verwenden und nur ein Objekt als' currentQuestion' zu haben? Es sieht so aus, als ob Sie vielleicht viele Geschäfte für Ihren Anwendungsfall verwenden. – Tholle

+1

Nein, aber es sieht so aus, als ob es die einzige Quelle der Wahrheit ist! – Wonka

Antwort

2

Mit MobX sollten Sie nie zwei Kopien der gleichen Sache haben. Das gleiche Frageobjekt sollte von allen Geschäften referenziert werden. Um dies zu erreichen, hängt es davon ab, wie Ihr Code eingerichtet ist, um die Fragen zu laden und zu speichern.

Ein Weg, ich dies empfehlen, tun, ist eine AllQuestionsStore zu haben, die alle Fragen in einer Karte enthält:

class AllQuestionsStore { 
    @observable questionsMap = asMap({}); 

    @action addQuestion(question) { 
    const map = this.questionsMap; 
    if (map.has(question.id)) { 
     extendObservable(map.get(question.id), question); 
    } else { 
     map.set(question.id, question); 
    } 
    return map.get(question.id); 
    } 
} 

Dann sind Sie, wenn Sie erstellen oder eine Frage laden, können Sie es zu diesem Speicher hinzufügen sollten. Wenn zum Beispiel laden Sie Benutzerfragen vom Server:

function loadedUserQuestions(userQuestions) { 
    const questions = userQuestions.map(AllQuestionsStore.addQuestion, AllQuestionsStore); 
    UserQuestionsStore.questionsList = questions; 
} 

Und wenn Sie die aktuelle Frage festlegen möchten:

CurrentQuestionStore.currentQuestion = AllQuestionsStore.addQuestion(question); 

Jetzt ist es gewährleistet, dass eine Frage nur eine Instanz hat, also wenn Sie Aktualisieren Sie es, andere Geschäfte werden nie veraltet sein.

+0

Vielen Dank für Ihre vorgeschlagene Vorgehensweise, ich probiere es aus, aber laufe auf ein Problem. Nachdem die 'loadedUserQuestions' ausgeführt wurde, füllen die Fragen die' AllQuestionsStore.questionsMap' auf, was großartig ist. Das Problem tritt auf, wenn 'loadedUserQuestions' zum zweiten Mal ausgeführt wird, insbesondere diese Zeile aus 'map.get (question.id) .merge (question);' mit diesem Fehler' map.get (...). Merge ist keine Funktion 'Es scheint nur aufzutreten, wenn' map.has (question.id) 'läuft. Das Abmelden zeigt, dass die 'question.id' und' question' beide dort existieren, also nicht sicher, was den Fehler verursacht. Irgendeine Idee, wie man es repariert? – Wonka

+0

Whoops! Ja natürlich, das war mein Fehler. Ich werde die Antwort bearbeiten, um sie zu korrigieren. –

+0

Funktioniert jetzt perfekt, danke! – Wonka

Verwandte Themen