2015-04-15 4 views
8

Ich habe ein CMS, das URLs zu Seiten mit einem bestimmten Muster zwingt. Wir müssen diese Links neu schreiben.AngularJS: ui-Router href in ui-sref umschreiben

Das CMS auf der Seite so etwas wie gedruckt wird:

<a href="/path/to/the/zoo/gorilla.html">Go</a> 

Unsere Router weisen tatsächlich auf

#/zoo/gorilla 

Wenn wir den Link selbst geschrieben hatte, würde es aussehen muss:

Das Problem ist, wir können nicht immer garantieren, dass der/Zoo/Gorilla Teil bedeutet, dass wir im Zoo sind ('Gor Illa ').

wäre, die CMS-URL in dem Router URL Der einfachste Weg, zu analysieren und wie etwas zu tun:

link.attr("href", "#/zoo/gorilla"); 

Ich verstehe, warum dass in der Regel gegen die Idee des ui-Router ist, aber ich Ich hoffe, einen Weg zu finden, es für diesen seltsamen Fall zu benutzen.

Antwort

3

Ich denke, das würde funktionieren, im Grunde eine Richtlinie zu ändern, welche URL Sie in Richtung auf, wenn Sie darauf klicken.

module.directive('newHref', ['$location',function($location) { 
    return function(scope, element, attrs) { 
     element.bind('click', newHref); 

     function newHref(event) { 
      var hrefList = event.target.href.split("/"); 
      var parent = hrefList[hrefList.length-2]; 
      var child = hrefList[hrefList.length-1].split(".")[0]; 

      $location.path("/" + hrefList.slice(0, hrefList.length-2).join("/") + "/" + parent + "/" + child); 
     } 
    } 
}]); 

verwenden Sie es wie:

<a href="/path/to/the/zoo/gorilla.html" new-href>Go</a> 
+0

ich das versucht, bevor er fragte machen. Wenn Sie den href ändern, wird die URL auf den richtigen Hashwert gesetzt, der Status erkennt diese Änderung jedoch nicht. – oooyaya

+0

@oooyaya hat den Code geändert, damit der Router die Änderung sehen kann –

+0

Dies ist, was ich getan habe. Das Problem war eigentlich etwas anderes - Ui-Router benannte Unteransichten zu verwenden und sie im Sichtenobjekt anzusprechen. Deshalb hat sich der Ausblick nie geändert - ich habe ihm nicht gesagt, wohin er gehen soll. – oooyaya

0

Es sieht aus wie in gefährliche Zone treten, aber Sie können „href“ Richtlinie erstellen, die automatisch Wert von href Attribut ersetzen wird. Keine zusätzlichen Attribute benötigt, aber es kann Ihren Code ein wenig zweideutig ...

module 
    .directive('href', function() { 
    return function(scope, element, attrs) { 
     var ngUrl; // convert CMS url to Angular URL somehow 
     if(attrs.href === '/path/to/the/zoo/gorilla.html') { 
      ngUrl = '#/zoo/gorilla'; 
     } 

     element[0].href = ngUrl; 
    }; 
}); 

See here

+0

Wir haben etwas ähnliches gemacht. Vielleicht ist es ein falsches Symptom. Der href wird geändert und die URL ändert sich zu dem, was wir möchten, wenn wir darauf klicken, aber die Ansicht ändert sich nicht. Gibt es etwas Offensichtliches, was bedeutet? Es stimmt mit einer Route und den Teilladungen überein, aber es wird nie angezeigt. – oooyaya

+0

Hmm, sieh dies: http://jsfiddle.net/erykpiast/zog1yaxy/1/. Es funktioniert einfach ... –