2013-03-07 136 views
8

我想用一个JSON对象来初始化一个Angular模型,这个对象将被嵌入到一个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呈现到此函数中时才有效。

如何访问角控制器中单独的js文件中的tags字段?

回答

11

至少有两种方式:

  1. 声明你tags阵列在一个独立的脚本标签,在这种情况下,你的tags变量将被绑定到窗口对象。将$ window注入控制器以访问窗口绑定变量。
  2. ng-init指令中声明tags数组。

显示这两种解决方案:

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标签中声明它?例如,如果在上面的'ng-init'内声明的'tags'数组是一个非常大的数组,我想在视图中初始化它(从服务器端代码前),我可以使用类似'{{tags = [{...}]}}而不是? – GFoley83 2013-04-01 21:32:12

+0

@Stewie第二种方法也存在问题。如果标签是通过jsonify方法生成的,并且它们包含引号,则所有内容都会制动。 – Hartimer 2013-08-10 01:24:56

+0

我看不到任何比使用$ window for @ GFoley83的用例更好的方法;我有同样的问题,我发送了一个初始的JSON负载和我想要注入到控制器中的标记,但这对于Angular来说非常困难。我不喜欢污染窗口对象(或者不得不拉入全局变量),但它似乎是最好的方式。 – 2013-10-23 00:52:32