2015-04-15 11 views
8

Mam system CMS, który wymusza adresy URL stron o określonym wzorze. Musimy warunkowo przepisać href do tych linków.AngularJS: ui-router href przepisuje na ui-sref

CMS zostanie wydrukowany na stronie coś takiego:

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

naszym routerze musi rzeczywiście wskazują na

#/zoo/gorilla 

Gdybyśmy pisemnej ten link siebie, to będzie wyglądać:

<a ui-sref="zoo('gorilla')>Go</a> 

Problem polega na tym, że nie zawsze możemy zagwarantować, że część/zoo/goryl oznacza, że ​​jesteśmy w zoo ("gor illa ").

Najprostszym sposobem byłoby analizować url CMS do adresu routera i po prostu zrobić coś takiego:

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

rozumiem dlaczego tak jest zazwyczaj przeciwko samej idei UI-router, ale I” Mam nadzieję, że znajdę sposób na wykorzystanie tego jednego dziwnego przypadku.

Odpowiedz

3

Myślę, że to działałoby, w zasadzie dyrektywa zmieniająca adres, do którego zmierzasz po kliknięciu.

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); 
     } 
    } 
}]); 

używać go jak:

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

próbowałem tego wcześniej pytania. Zmiana href wskazywałaby URL na odpowiedni skrót, ale stan nie rozpoznaje tej zmiany. – oooyaya

+0

@oooyaya zmienił kod, aby router mógł zobaczyć zmianę –

+0

To właśnie zrobiłem. Problem polegał na czymś innym - użyciu pod-widoków o nazwie routery-ui i skierowaniu ich w obiekcie widoków. Dlatego widok nigdy się nie zmienił - nie mówiłem mu, gdzie mam iść. – oooyaya

0

To wygląda jak wejście do strefy niebezpiecznej, ale można tworzyć „href” dyrektywę, która będzie automatycznie zastąpić wartość atrybutu href. Bez dodatkowych atrybuty potrzebne, ale może to uczynić kod nieco dwuznaczny ...

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

Zrobiliśmy coś podobnego. Może to fałszywy objaw. Href zmienia się, a adres URL zmienia się, gdy chcemy go kliknąć, ale widok się nie zmienia. Czy jest jakaś oczywista rzecz, która oznacza? Pasuje do trasy i częściowych obciążeń, ale nigdy się nie wyświetla. – oooyaya

+0

Hmm, zobacz: http://jsfiddle.net/erykpiast/zog1yaxy/1/. Po prostu działa ... –