从AngularJS中访问全局变量

8
我希望能够使用嵌入在HTML页面中的JSON对象初始化Angular模型。例如:
<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>

由于在$scope中查找,因此无法解析tags字段。我尝试在控制器中像这样访问tags字段:

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

但是它并不起作用。

只有当我直接将TagList包含在HTML页面中,并将JSON直接渲染到该函数中时,它才有效。

如何在Angular控制器的独立js文件中访问tags字段?

1个回答

11

至少有两种方法:

  1. 在独立的脚本标记中声明你的 tags 数组,这样你的 tags 变量将被绑定到 window 对象上。注入 $window 到你的控制器中以访问你的与 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

我强烈不建议污染window对象。


1
有没有其他方法可以在视图中初始化变量,而不必在HTML标记内声明它?例如,如果在ng-init中声明的tags数组是一个非常大的数组,并且我想在视图中(例如从服务器端代码)初始化它,我可以使用类似{{ tags = [{...}] }}的东西吗? - GFoley83
@Stewie,第二种方法也存在问题。如果标签是通过jsonify方法生成的,并且如果它们包含引号,那么一切都会崩溃。 - Hartimer
我认为在@GFoley83的情况下,使用$window是最好的选择;我也遇到了同样的问题,我发送了一个包含所需注入控制器标记的初始JSON负载,但是在Angular中实现这一点似乎非常困难。我也不喜欢污染window对象(或者引入全局变量),但这似乎是最好的方法。 - El Yobo
1
@ElYobo 是的,这确实很困难,目前还没有解决的简单方法。我在考虑使用类似 <input type="hidden" data-ng-init="tags = [{name: 'some json'}]" /> 这样的东西,而不是传递全局变量。 - GFoley83

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接