52

首先,我查了一下,没有找到任何涵盖我的问题的文章。

如何在 angularJS 内置指令中访问预定义的 js 全局变量?

例如,我在<script>var variable1 = true; </script>

然后我写了一个AngularJS指令:

<div ng-if="variable1">Show some hidden stuff!</div>

这真的行不通。

然后我被告知我应该使用ng-init

所以我在其他地方写了代码,比如:

<div ng-init = "angularVariable1 = variable1"></div>

而这显然也不起作用……这就像一个恶性循环。需要访问预定义的js全局变量,则需要使用ng-init;为了使用 ng-init,您需要访问全局变量。

有什么特别的方法可以做到这一点吗?

4

3 回答 3

97

我创建了一个有效的 CodePen 示例,演示如何在 AngularJS 中以正确的方式执行此操作。Angular $window 服务应该用于访问任何全局对象,因为直接访问window会使测试更加困难。

HTML:

<section ng-app="myapp" ng-controller="MainCtrl">
  Value of global variable read by AngularJS: {{variable1}}
</section>

JavaScript:

// global variable outside angular
var variable1 = true;

var app = angular.module('myapp', []);

app.controller('MainCtrl', ['$scope', '$window', function($scope, $window) {
  $scope.variable1 = $window.variable1;
}]);
于 2013-10-15T14:43:11.403 回答
12

将全局变量复制到控制器范围内的变量中。

function MyCtrl($scope) {
   $scope.variable1 = variable1;
}

然后你可以像你尝试的那样访问它。但请注意,当您更改全局变量时,此变量不会改变。如果需要,您可以改为使用全局对象并“复制”它。由于它将通过引用“复制”,因此它将是同一个对象,因此将应用更改(但请记住,在 AngularJS 之外执行操作将需要您执行 $scope.$apply anway)。

但是,如果您能描述一下您实际尝试实现的目标,那也许是值得的。因为使用像这样的全局变量几乎从来都不是一个好主意,并且可能有更好的方法来达到您的预期结果。

于 2013-10-15T14:29:49.597 回答
1

我已经尝试过这些方法,发现它们不能满足我的需要。就我而言,我需要将 json 渲染的服务器端注入页面的主模板,因此当它加载和角度初始化时,数据已经存在并且不必检索(大型数据集)。

我找到的最简单的解决方案是执行以下操作:

在应用程序之外的 Angular 代码中,模块和控制器定义添加了一个全局 javascript 值 - 此定义必须在定义 Angular 内容之前出现。

例子:

'use strict';

//my data variable that I need access to.
var data = null;

angular.module('sample', [])

然后在你的控制器中:

.controller('SampleApp', function ($scope, $location) {

$scope.availableList = [];

$scope.init = function () {
    $scope.availableList = data;
}

最后,您必须初始化所有内容(顺序很重要):

  <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.min.js"></script>
  <script src="/path/to/your/angular/js/sample.js"></script>
  <script type="text/javascript">
      data = <?= json_encode($cproducts); ?>
  </script>

最后初始化你的控制器和初始化函数。

  <div ng-app="samplerrelations" ng-controller="SamplerApp" ng-init="init();">

通过这样做,您现在可以访问填充到全局变量中的任何数据。

于 2015-08-12T20:10:32.137 回答