2013-05-08 8 views
8

Ich arbeite an einem SPA, das ich mehrere Masteransichten verwenden möchte. Hier ist mein Anwendungsfall:Durandal Mehrere Masterseiten

Ich habe einen Benutzer, der eine Profilseite hat. Innerhalb dieser Profilseite möchte ich einige verschiedene Ansichten anzeigen können, z. Details, Arbeiten, Kontaktinformationen usw. Ich muss in der Lage sein, eine tiefe Verbindung zu jeder dieser Ansichten herzustellen. Jede dieser Ansichten muss die grundlegenden Benutzerdaten aus der Hauptlayoutansicht anzeigen.

Es ist mein Verständnis, dass ich Compose für diese verwenden sollte und ich habe ein wenig Code, der scheint zu arbeiten, aber ich möchte in der Lage sein, Daten von der "sekundären Shell" bis zur tatsächlichen Unteransicht übergeben . Es scheint, dass die Splat-Daten nicht an die Aktivierungsmethode des Unteransichtsmodells weitergegeben werden.

In meinem "Master" ViewModel habe ich ein Observable namens activeView erstellt, das eine Zeichenkette enthält, die einem Sub ViewModel entspricht (viewmodels/user/details). Ich habe dann eine Knockout-Anweisung, die wie folgt lautet:

Wie kann ich Daten an die Unteransicht übergeben? Oder gibt es einen besseren Weg, dies zu tun?

Vielen Dank im Voraus!

Antwort

1

Laut mir ist ko.compose nicht so dynamisch und scheint wie Razors Layout zu funktionieren. Mit Durandal ist es besser, separate Ansichten zu machen, wie Sie können und dann, verknüpfen Sie sie mit dem Router. Ich arbeite mit John Papas Hot-Towel-Vorlage; Mein Vorschlag betrifft die Weitergabe von Daten (mehr als ID) mit Durandal-Router und Knockout.

Wenn Ihre App Initialisieren (shell.js, main.js, ...) Karte Ihre Routen irgendwo (shell.js oder main.js) mit Einstellungen für eventuell Filterung. Für Strecken, die Daten transportieren, baute sie mit der (: id) Vorschlag

router.mapRoute('view/:id', moduleId, 'Customer Details', false); 

Wo und wann einige Strecken erforderlich Sie können einen Blick auf Joseph Gabriel-Lösung haben (https://stackoverflow.com/a/16036439/2198331) Ihre Routen filtern für Verwenden Sie wo und wann Sie sie brauchen. Nachdem Sie die Routen gefiltert haben, können Sie routeInfo hacken, um Ihre Parameter (Strings oder Objekte wie selectedItem) zu transportieren.

arearoutes = ko.utils.arrayFilter(router.visibleRoutes(), function (route) { 
       // mgpe has been set at app init 
       return route.settings.mgpe === 112; 
      }); 

erweitern routeInfo aus Filters Ergebnisse mit der Daten, die Sie

areaRoutes.forEach(function(ar){ 
    ar.myItem = mydata; // or vm.selectedItem(); DEPARTURE LUGGAGE 
}, areaRoutes); 

Ihre (myItem) wird nun an diesen Strecken transportieren wollen als so, wie Sie wie Dieser oder diese Route (s) werden Ihre Daten mit sich führen und werden niemals verloren gehen, es sei denn, Sie haben dasselbe Objekt des Routers aktualisiert (myItem)

eine Route kann verschachtelte Routen enthalten Nützlich für verschachtelten Kontext wie verschachtelte Menüs; Sie können durch die Vorbereitung der Reise mit Kindern Routen spielen, wenn ein Elternteil Route aktiv ist:

router.activeItem.settings.areSameItem = function (currentItem, newItem, activationData) { 
    mybag = activationData.routeInfo; // TRAVEL (current) LUGGAGE are present here 
} 

N. B. : vor der Verwendung dieses Workarounds müssen Sie das Sicherheitsproblem berücksichtigen und da ich neu bei Durandal bin, weiß ich nicht, ob dies ernsthafte Konsequenzen für den Lebenszyklus des Routers mit sich bringt. Achten Sie auch auf die Namen von Objekten, da diese permanent während der Lebenswege des Routers bleiben.

0

Wie wäre es, wenn Sie ein Benutzerobjekt erstellen und es in jedem Ihrer Ansichtsmodelle benötigen? Die einfache Sache wäre, sie an die App anzuhängen (d. H. App.user =) Änderungen, die an einer der Observablen in dem Benutzerobjekt vorgenommen werden, werden zu jeder der Ansichten und Ansichtsmodellen innerhalb Ihres SPA aktualisiert.

diese Weise können Sie die Fähigkeiten der Knockout-Bibliothek Unter/pub sind die Nutzung

+0

Die Anwendung, die ich benötigt mehr als nur Benutzerobjekte dieses Verhalten schrieb. Durandal 2.0 führte "Kind-Router" ein, die es Benutzern ermöglichen, mehrere verschachtelte Shells mit Deep-Linking-Unterstützung zu erstellen. Natürlich Kinderrouter waren der Weg für mich. – mcottingham

+0

Verstanden, diese beiden Ideen (Routing und ein Anwendungsdatenkontext) arbeiten zusammen. Sie erstellen ein SPA, das sich auf der Clientseite initialisiert und selten einen vollständigen Post zurückgibt. Der Wert, den Sie erhalten, besteht darin, dass Sie Ihr Entwicklungssimulator eher an eine Desktop-App als an die herkömmliche Web-App, die vollständige Postbacks verwendet, herantreten. Dies bedeutet, dass Sie einen Datenkontext erstellen können, der Objekte im Speicher speichert. Auf diese Weise müssen Sie keine Objekte zwischen Ansichten übergeben. Sie können lediglich einen globalen Datenkontext pflegen und eine ID innerhalb der Route mit Parametern anstelle von ganzen Objekten weitergeben. – onzur