2013-07-06 12 views
44

Chcę używać kilku stałych bezpośrednio w html, a kilka razy w kontrolerach.Czy mogę uzyskać bezpośredni dostęp do modułu stałej z HTML pod AngularJS

Na przykład, jest to główny moduł aplikacji:

angular.module('website', []) 
.constant('ROUTES', (function() { 
    return { 
     SIGN_IN: '/sign/in' 
    } 
})()) 
.config([..., 'ROUTES', function(..., ROUTES { 
    $routeProvider.when(ROUTES.SIGN_IN, {templateUrl: 'pages/sign_in.html', controller:  'SignInController'}); 
}]); 

Więc to jest jasne, w jaki sposób używać stałych z kontrolerów.

Ale jak można zrobić coś takiego:

<html ng-app="website"> 
<body> 
<a href="{{ROUTES.SIGN_IN}}">Sign in</a> 
</body> 
</html> 

Chodzi o to, aby utrzymać wszystkie trasy w jednym miejscu. Więc, czy mogę to zrobić, czy może jestem wybrany niewłaściwie?

+5

tylko dodać trasy do zakresu dolarów SignInController –

+0

dziękuję dużo, to jest to, czego potrzebuję. –

Odpowiedz

76

IMHO lepszy sposób to zrobić, to użyć $rootScope w HTML każdy zakres dziedziczy od $ rootScope, więc jeśli zmienna nie jest obecny w bieżącym zakresie kątowym użytku zgłoszonemu w $ rootScope.

Dobry (IMHO) sposobem jest zainicjować to w run "Faza"

angular.module('myApp') 
    .run(function ($rootScope) { 
     $rootScope.ROUTES = ROUTES 
    }); 

 

+1

Tak, to wygląda o wiele lepiej, dzięki –

+0

Myślę, że to powinna być koncepcja, którą każdy próbuje zrozumieć, zanim zacznie pisać jakiekolwiek kontrolery. Nie wiem, ile razy pracowałem na kontrolerze z załadowanym do niego zasięgiem i rootkopem. – CarComp

+7

Należy pamiętać, że wartość zdefiniowana w '$ rootScope' nie będzie dostępna bezpośrednio w dyrektywach z izolowanymi zakresami. W takich przypadkach możesz uzyskać tę wartość za pomocą '$ root.ROUTES' w widoku. – fracz

16

lubię też podejścia $ rootScope, ale mam w używane pewne sytuacje filtr.

Jako przykład uproszczony, przypuśćmy, że istnieje stała KONFIG zdefiniowana gdzieś jako obiekt z właściwością o nazwie BuildVersion. Można stworzyć coś takiego: filtr

angular.module('myApp') 
    .filter('interpolate', ['CONFIG', function (CONFIG) { 
     return function (text) { 
      return String(text).replace(/\%VERSION\%/mg, CONFIG.BuildVersion); 
     }; 
    }]); 

aw HTML:

<html ng-app="website"> 
    <body> 
     <div>{{'%VERSION%' | interpolate}}</div> 
    </body> 
</html> 

lub

<html ng-app="website"> 
    <body> 
     <div>{{'bla bla bla %VERSION%.' | interpolate}}</div> 
    </body> 
</html> 
+0

Prawie to wykorzystałem, ponieważ było to znajome i jest to dobra odpowiedź, ale uważam, że zaakceptowana odpowiedź jest ogólnie lepsza. Przegłosowano oba. – VSO

17

Nieco podobny do innych odpowiedzi, ale IMO czystsze:

angular.module('website') 
    .constant("ROUTES", { 
     SIGN_IN: "/sign/in" 
    }) 
    .run(function ($rootScope, ROUTES) { 
     $rootScope.ROUTES = ROUTES; 
    }); 

I:

<a href="{{ROUTES.SIGN_IN}}">Sign in</a> 

HTH

+0

To jest dobre podejście. Utrzymuje kod uruchomiony przy zachowaniu separacji od danych. –

Powiązane problemy