2016-05-15 7 views
1

Ich verwende Konzept.UI-Router verschachtelte Ansicht nicht aufgelöst

Die Dokumentation sagt, dass ich resolve auf einzelne Ansichten haben kann. Wie Sie in my plunker sehen können, habe ich eine Lösung für meine Kindansicht. Die Auflösung gibt ein Versprechen zurück, das in meinem Fall im übergeordneten Controller aufgelöst wird. Ich habe mein Problem mit einem setTimeOut simuliert. Grundsätzlich sollte nach 5 Sekunden die Kinderansicht geladen werden (mit einem Warnhinweis "In Child State"), aber das tut es nicht !!!

Relevanter Code ist unten, bitte beziehen Sie sich stattdessen auf Plunker.

'[email protected]': { 
    template: '<h4>This is Child State</h4>', 
    controller: childCtrl, 
    resolve: { 
     trd: function(tradeFactory) { 
      console.log('in resolve of child'); 
      return tradeFactory.ready(); 
     } 
    } 
} 
+0

Wo ist der Code, den Sie in der Frage erwähnt? –

+0

lesen Sie dieses Beispiel [verschachtelte Ansichten] (http://stackoverflow.com/questions/34251255/creating-nested-route-app-in-angular-using-angular-ui-router-and-switching-betwe) – Maher

+0

@Maher der Link, den Sie empfohlen haben, hat kein Beispiel für "lösen? Anders als beheben Sie meinen Code funktioniert gut. – TkNeo

Antwort

1

(Überprüfen Sie aktualisiert und Arbeits plunker) Der Punkt hier ist:

alle resolvebereits gelöst werden müssen, bevor die Ansichten (mit Controller) gerendert werden

Und das ist in Ihrem Szenario nicht wahr. In der Tat gibt es eine Wettlaufbedingung, die in der Sackgasse endet.

  1. eine Ansicht für eine Entschlossenheit wartet (ist mit einer promise)
  2. anderen Controller Ansicht ist bereit, Entschlossenheit auslösen (ein Versprechen aufgelöst machen), aber ... es kann nicht ausgelöst werden, während für seine Geschwister warten

Der ursprüngliche Schnipsel

views: { 

    '': { 
    ... 
    // inside of this, you expect to resolve the below promise 
    controller: parentCtrl 
    }, 


    '[email protected]': { 
     ... 
     resolve: { 
      trd: function(tradeFactory) { 
       // this is a promise waiting for resolve 
       // implemented in parent controller ... deadlock 
       return tradeFactory.ready(); 
      } 
     } 
    } 

Also, das obige funktioniert nicht. Wir müssen alles innerhalb des Entschlusses tun, z.B. auf diese Weise:

views: { 

    '': { 
    ... 
    controller: parentCtrl, 
    // here do the resolve 
    resolve: { 
     parentReady: function(tradeFactory){ 
     setTimeout(function(){ 
      tradeFactory.ResolveReady() 
     }, 1500); 
     } 
    } 
    }, 


    '[email protected]': { 
     ... 
     resolve: { 
      trd: function(tradeFactory) { 
       console.log('in resolve of child'); 
       return tradeFactory.ready(); 
      } 
     } 
    } 

Es gibt updated plunker

+0

vielen Dank für die Antwort.In meinem Workflow wird die uesr einige Zeit verbringen Übergeordnete Ansicht, bevor sie die untergeordnete Ansicht öffnen Die untergeordnete Ansicht benötigt eine Menge Daten, aber die Auflösung meiner Eltern ist keine gute Idee, denn wenn der Benutzer an der übergeordneten Ansicht arbeitet, sollten wir diese untergeordneten Daten in den Hintergrund laden Warum löst ich das Versprechen von Eltern-Controller im Gegensatz zu Eltern lösen Andere Vorschläge, wie dies zu tun ist – TkNeo

+0

Der Weg zu gehen, ist die Verwendung von UI-Router zu ändern.In diesem Szenario sollten Sie nicht wie y spielen ou tun - mit zwei Ansichten in einem Staat. Sie sollten das in ** zwei Zustände ** mit * einer Ansicht * aufteilen. Das wird in der Tat vereinfachen alle, wird wirklich die Macht der UI-Router und Resolver * (und machen es meist leicht zu verstehen, nach wenigen Monaten;) *. Also, stellen Sie den Kindstatus ein ... alles wird gelöst ... Dies ist eines der Beispiele http: // stackoverflow.com/q/28800644/1679310 –

+0

Ich habe viel darüber nachgedacht, ob zwei 2 Staaten oder 2 Ansichten (es wird mehr Kinder in Zukunft hinzugefügt werden). Ich gehe hin und her b/c Ich mag die Idee nicht, URLs zu ändern, da Benutzer Eltern werden -> Kind1 -> Eltern -> Kind 2. Also ich dachte, Ansichten ist der Weg zu gehen. Wenn ich die Kindansicht in den Status umgewandelt habe, wie werde ich meine Kinderversprechen von Eltern lösen? Dieses Problem bleibt noch, nicht wahr? (Das Laden der Daten muss im Hintergrund im Parent erfolgen und nicht im Child-Modus. Child muss nur warten, bis der Parent das Versprechen löst) – TkNeo

Verwandte Themen