2013-03-07 6 views
8

Я хочу инициализировать угловую модель с помощью объекта JSON, который встроен в HTML-страницу. Пример:Доступ к глобальной переменной из 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> 

tags поле не может быть решена, потому что она ищется в $scope. Я пытался получить доступ к tags поля в моем контроллере, как это:

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

Но это не работает.

Он работает только в том случае, если я включаю TagList непосредственно в HTML-страницу и передаю json непосредственно в эту функцию.

Как я могу получить доступ к полю tags в отдельном файле js в угловом контроллере?

ответ

11

Есть по крайней мере два способа:

  1. возвещать tags массив в автономных тегах сценария, в этом случае переменная tags будет привязан к объекту окна. Внесите $ window в ваш контроллер, чтобы получить доступ к связанным с окном переменным.
  2. Объявите свой массив tags внутри директивы ng-init.

Показаны оба решения:

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

Я настоятельно советую против загрязняющего объекта окна.

+1

Есть ли другой способ инициализировать переменную в представлении, не объявляя ее внутри тега HTML? Например, если массив 'tags', объявленный внутри' ng-init' выше, был действительно большим массивом, и я хочу инициализировать его в представлении (из кода на стороне сервера для ex.), Могу ли я использовать что-то вроде '{{tags = [{...}]}} 'вместо этого? – GFoley83

+0

@Stewie есть также проблемы со вторым подходом. Если теги генерируются методом jsonify, и если они содержат кавычки, все будет тормозить. – Hartimer

+0

. Я не вижу лучшего способа, чем использовать окно $ для использования для использования GFoley83; У меня такая же проблема, я посылаю начальную полезную нагрузку JSON с разметкой, которую я хочу ввести в контроллер, но это удивительно сложно сделать с Angular. Мне не нравится загрязнять оконный объект (или вытягивать глобальные переменные), но это кажется лучшим. –

Смежные вопросы