2013-03-07 22 views
8

Chcę zainicjować model kątowy za pomocą obiektu JSON, który jest osadzony na stronie HTML. Przykład:Dostęp do zmiennej globalnej z AngularJS

<html> 
    <body> 
    <script type="text/javascript" charset="utf-8"> 
     var tags = [{"name": "some json"}]; 
    </script> 
    <ul> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </body> 
</html> 

Pole tags nie może zostać rozwiązany, ponieważ jest on spojrzał w $scope. Próbowałem otworzyć pole tags w moim kontroler następująco:

function TagList($scope, $rootScope) { 
    $scope.tags = $rootScope.tags; 
} 

Ale to nie działa.

Działa tylko wtedy, gdy dołączę TagList bezpośrednio do strony HTML i renderuję json bezpośrednio do tej funkcji.

Jak mogę uzyskać dostęp do pola tags w oddzielnym pliku js w kontrolerze kątowym?

Odpowiedz

11

Istnieją co najmniej dwa sposoby:

  1. zadeklarować tablicę tags w samodzielnym tagów scenariusz, w którym to przypadku zmienna tags będą zobowiązane do obiektu window. Wstaw $ okno do kontrolera, aby uzyskać dostęp do zmiennych związanych z oknem.
  2. Zadeklaruj swoją tablicę tags wewnątrz dyrektywy ng-init.

Pokazuje oba rozwiązania:

HTML:

<body> 

    <script type="text/javascript" charset="utf-8"> 
    var tags = [{"name": "some json"}]; 
    </script> 

    <div ng-controller="AppController"> 
    tags: {{tags | json}} 
    <ul> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </div> 

    <div> 
    <ul ng-init="tags = [{name: 'some json'}]"> 
     <li ng-repeat="tag in tags">{{tag.name}}</li> 
    </ul> 
    </div> 

</body> 

JS:

app.controller('AppController', 
    [ 
    '$scope', 
    '$window', 
    function($scope, $window) { 
     $scope.tags = $window.tags; 
    } 
    ] 
); 

Plnkr

Zdecydowanie odradzam zanieczyszczających okien obiektu.

+1

Czy istnieje inny sposób zainicjowania zmiennej w widoku bez konieczności zadeklarowania jej wewnątrz znacznika HTML? Na przykład, jeśli tablica 'tags' zadeklarowana w' ng-init' powyżej była naprawdę dużą tablicą i chcę ją zainicjować w widoku (z kodu po stronie serwera dla przykładu), mogę użyć czegoś takiego jak '{{tags = [{...}]}} 'zamiast? – GFoley83

+0

@Stewie są również problemy z drugim podejściem. Jeśli znaczniki są generowane za pomocą metody jsonify, a jeśli zawierają cytaty, wszystko się zahamuje – Hartimer

+0

Nie widzę lepszego sposobu niż użycie okna $ dla przypadku użycia @ GFoley83; Mam ten sam problem, wysyłam początkowy ładunek JSON ze znacznikiem, który chcę wprowadzić do kontrolera, ale jest to zaskakująco trudne w przypadku Angular. Nie lubię zanieczyszczania obiektu okna (lub konieczności wciągnięcia globali) albo, ale wydaje się to najlepszym sposobem. –

Powiązane problemy