Richtiges Konfigurieren von Routern für die Eltern-Kind-Beziehung in Backbone Marionette

StackOverflow https://stackoverflow.com/questions/9399602

  •  29-10-2019
  •  | 
  •  

Frage

Es wird versucht, eine Seite zu erstellen, auf der Benutzer ein übergeordnetes untergeordnetes Element bearbeiten und anzeigen können.

Die Benutzeroberfläche besteht aus 3 Spalten Eltern: Liste der Eltern Kinder: Kind

Ich möchte die Controller so konfigurieren, dass Benutzer wieder genau dort sind, wo sie waren, aber keine Notwendigkeit dafür haben, damit sowohl Eltern als auch Kinder bearbeitet werden können.

// Mit der Backbone-Marionette näher kommen, aber immer noch einige kleine Probleme haben

    MyRouter = Backbone.Marionette.AppRouter.extend({
        appRoutes: {
            '': 'AddClient',
            'View/:clientid': 'ViewClient',
            'Edit/:clientid': 'EditClient',
            'View/:clientid/Add': 'PolicyAdd',
            'View/:clientid/View/:policyid': 'PolicyView',
            'View/:clientid/Edit/:policyid': 'PolicyEdit'
        }
    });

    someController = {
        AddClient: function () {
            var someView = new ClientAdd();
            MyApp.clientPane.show(someView);
        },
        ViewClient: function (clientid) {
            var someView = new ClientView();
            MyApp.clientPane.show(someView);
        },
        EditClient: function (clientid) {
            var someView = new ClientEdit();
            MyApp.clientPane.show(someView);
        },
        PolicyAdd: function (clientid) {
            this.ViewClient(clientid);
            var someView = new PolicyAdd();
            MyApp.policyPane.show(someView);
        },
        PolicyView: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyView();
            MyApp.policyPane.show(someView);
        },
        PolicyEdit: function (clientid, policyid) {
            this.ViewClient(clientid);
            var someView = new PolicyEdit();
            MyApp.policyPane.show(someView);
        }
    };

Der "this.ViewClient" fühlt sich hackig an und funktioniert auch nicht.

War es hilfreich?

Lösung

Mehrteilige Antwort hier ...

"this.ViewClient ist keine Funktion"

Dies ist ein Fehler in Marionette. Die Controller-Methode wird im Kontext des Routers anstelle des Controllers aufgerufen, sodass beim Aufruf von this.ViewClient versucht wird, sie auf dem Router zu finden.

oops.

Fehler protokolliert. wird so schnell wie möglich beheben. https://github.com/derickbailey/backbone.marionette/issues/38

-

UPDATE : Dieser Fehler wurde jetzt in Version 0.5.1 von Backbone.Marionette behoben https://github.com/derickbailey/backbone.marionette

-

Um dieses Problem vorerst zu umgehen, können Sie Folgendes tun:

PolicyEdit: {
  someController.ViewClient();
  // ...
}

Wenn dies nicht funktioniert, müssen Sie möglicherweise die bind- oder bindAll-Methoden von Underscore.js verwenden, um die korrekte Bindung Ihrer Controller-Funktionen sicherzustellen.

Diese Problemumgehung wird nicht erforderlich sein, sobald ich den Fehler behoben habe ... hoffentlich später heute / heute Abend.

nennt im Grunde genommen andere Routen den besten Weg, um mehrere Regionen zu manipulieren?

Die direkte Antwort auf diese Frage lautet Nein.

In diesem Fall rufen Sie jedoch keine Route an. Sie rufen eine Methode auf Ihrem Controller auf. Das ist vollkommen in Ordnung - und eigentlich würde ich das fördern. Es ist eine ordnungsgemäße Verwendung Ihres Objekts und eines der Dinge, die meiner Meinung nach getan werden sollten, anstatt einen anderen Route / Router-Handler aufzurufen.

Router und Controller

Ein Router ist eine Funktion, keine architektonische Anforderung. Ihre App sollte ohne Router funktionieren, und ein Router sollte nur die Möglichkeit hinzufügen, Lesezeichen und die Vorwärts- / Rückwärts-Schaltfläche des Browsers zu verwenden.

In Anbetracht dieser Philosophie (von der ich weiß, dass sie umstritten ist) ist die Verwendung eines Controllers wie Ihres und das Aufrufen mehrerer Methoden auf Ihrem Controller, um Ihre Anwendung in den richtigen Zustand zu versetzen, einer der richtigen Ansätze.

Betrachten Sie es so: Wenn Sie den Router aus Ihrer App entfernen, müssen Sie Methoden direkt auf Ihrem Controller aufrufen. Um das Duplizieren von Code zu verhindern, sollten Sie auf Ihrem Controller viele kleine Methoden erstellen, die eine Sache sehr gut können, und dann aus diesen kleineren Methoden größere Methoden zusammensetzen.

Hoffe das hilft. :)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top