Knockout JS ObservableArray mit vielen Beziehungen

Ich erstelle eine Gästelisten-App mit Knockout.js, und bis jetzt läuft alles rund. Ich habe jedoch eine Frage zu Best Practices. Meine App verfügt über verschiedene Arten von Objekten: Gäste und Tags. Gäste können mehrere Tags haben, und Tags können mehrere Gäste haben. An verschiedenen Stellen in der App muss ich beide Arrays einzeln anzeigen. Zum Beispiel habe ich eine "Gäste" -Ansicht, in der man alle Gäste zusammen mit den dazugehörigen Tags sehen kann, und ich habe auch eine "Tags" -Ansicht, in der man alle Tags und die dazugehörigen Gäste sehen kann. Gegenwärtig sieht der Code zum Hinzufügen eines Tags zu einem Gast ungefähr so ​​aus:

var tag = function(opts) {
  this.guests = ko.observableArray()

  // Other tag code here...
}

var guest = function(opts) {
  this.tags = ko.observableArray()
  // Other guest code here...

  var self = this

  this.addTag = function(tag) {
    self.tags.push(tag)
    tag.guests.push(self)
  }
}

Ich weiß, dass es in Knockout einen besseren Weg geben muss, um diese Art von Viele-zu-Viele-Beziehung herzustellen, als jedes beobachtbare Array einzeln zu aktualisieren. Dies führt auch zu einer Art rekursiver App-Struktur, bei der ein Gast eine Eigenschaft / ein Array tags hat, das ein Tag enthält, das eine Eigenschaft / ein Array guest enthält, das eine Eigenschaft tags enthält ... Sie erhalten das Bild.

Derzeit sieht die ViewModel-Struktur folgendermaßen aus:

- Parent Object
  - Guests ObservableArray
    - Guest Object
      - Tag Object as property of Guest
  - Tags ObservableArray
    - Tag Object
      - Guest Object as property of Tag

Ich schätze, meine Frage ist zweifach: 1) Gibt es eine bessere Möglichkeit, mein ViewModel zu strukturieren, um rekursive Arrays zu vermeiden? und 2) wie kann ich Knockout.js besser verwenden, um mein ViewModel auf eine DRY-Weise zu aktualisieren, anstatt sowohl das Tag-Array als auch das Gast-Array einzeln zu aktualisieren? Vielen Dank!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage