2017-03-23 1 views
0

Mit dem folgenden Code in einem Backbone-Router kann sichergestellt werden, dass beim direkten Navigieren eines Benutzers zu #test/map oder #test/images zuerst die an die Route angehängte Funktion #test ausgeführt wird?Backbone - Routefunktion vor Unterroutenfunktion ausführen

Die Funktion invokeTest erstellt eine übergeordnete Ansicht mit dem Container, in dem die Unteransichten "map" und "images" gerendert werden. also muss ich sicherstellen, dass die Basislayout-Ansicht gerendert wurde, bevor Sie springen, um die Subviews zu rendern.

var Workspace = Backbone.Router.extend({ 
 
    routes: { 
 
    "test":     "invokeTest", // #test 
 
    "test/map":  "invokeTestMap", // #test/map 
 
    "test/images": "invokeTestImages" // #test/images 
 
    }, 
 

 
    invokeTest: function() { 
 
    //render base-layout 
 
    console.log("test function executed"); 
 
    }, 
 

 
    invokeTestMap: function() { 
 
    //render map view using element created with the base layout template 
 
    console.log("Map function executed"); 
 
    }, 
 
    invokeTestImages : function(){ 
 
    //render images view using element created with the base layout template 
 
    console.log("images function executed"); 
 
    } 
 

 
});

jetzt nur ich das Konsolenprotokoll für die Subviews bekommen, wird die Wurzelfunktion nie aufgerufen.

Antwort

1

Sie können einfach tun:

invokeTest: function() { 
    //render base-layout 
    createBaseLayout(); 
    console.log("test function executed"); 
    }, 

    invokeTestMap: function() { 
    createBaseLayout(); 
    //render map view using element created with the base layout template 
    console.log("Map function executed"); 
    }, 
    invokeTestImages : function(){ 
    createBaseLayout(); 
    //render images view using element created with the base layout template 
    console.log("images function executed"); 
    } 

Oder Sie können es tun, wie

invokeTestMap: function() { 
    this. invokeTest(); 
    //render map view using element created with the base layout template 
    console.log("Map function executed"); 
    }, 

Einfach gesagt Sie die Logik setzen müssen, in einer Funktion wiederverwendet werden und es nennen.

Wenn Sie dies in großem Maßstab tun müssen, können Sie in der initialize Ihres Routers Eltern-Kind-Beziehungen mit Regex identifizieren und den Child-Callback zu einer Funktion aktualisieren, die auch den Parent-Callback umschließt. (Oder Sie können noch tiefer in den Router gehen - Es scheint Plugins zu sein, die versuchen, ähnliches Problem wie backbone.subroute zu lösen.

+0

Ich verwendete die 'initialize' Methode, um das Basis-Layout zu rendern und es funktionierte gut, aber Jetzt habe ich eine Login-Ansicht, so kann ich diesen Ansatz nicht mehr verwenden .. Ihr zweiter Vorschlag scheint wie der Weg zu gehen, mit dem Router einen Verweis auf die Basis-Layout-Ansicht, und nur erstellen, wenn es nicht bereits existiert macht das Sinn? – randomguy04

+0

@ randomguy04 Ja, das ist in der Regel, wie ich jede Ansicht in Router –

+0

initialisiert habe So habe ich es so gemacht, funktioniert gut, aber ich bin ein bisschen besorgt über Wartung, da ich anrufen muss Diese neue Methode, die prüft, ob das Basislayout in jeder davon abhängigen Ansicht existiert, kann ich nur als Referenz für die Methode 'execute' verwenden, die vorher ausgeführt wurde Routennavigation), da nicht alle Ansichten in meiner App dieses Basislayout benötigen und es gibt eine Login-Ansicht, mit der besagt, dass Sie meine Frage genau beantwortet haben, danke! – randomguy04