【问题标题】:$window on ngClick directive$window on ng Click 指令
【发布时间】:2014-08-14 13:24:45
【问题描述】:

为什么这不起作用?

由于 Angular 表达式无法访问 window 对象,我使用了 $window,但以下不起作用。

<button ng-click="$window.alert('Hi There')">Hi There</button>

Angular 表达式无法访问全局变量,例如 窗口、文件或位置。这种限制是故意的。它 防止意外访问全局状态——一个常见的来源 细微的错误。

【问题讨论】:

    标签: angularjs


    【解决方案1】:

    模板只能访问放在其$scope 上的变量。如果您需要从模板访问 $window 上的任何内容,您需要将 $window 注入您的控制器并将其分配给 $scope 那里。

    例如

    angular.module('app').controller('Controller', 
      ['$scope', '$window', function($scope, $window) {
          $scope.$window = $window;
    }]);
    

    正如 cmets 中所指出的,您可能不想将整个 $window 包装器暴露给您的模板,因此更好的方法是在 $scope 上使用辅助函数。

    ng-click="greet('Hi There')"
    
    angular.module('app').controller('Controller', 
      ['$scope', '$window', function($scope, $window) {
          $scope.greet = function(message) {
              $window.alert(message);
          };
    }]);
    

    【讨论】:

    • 这可行,但不建议将整个服务放入 $scope。更多信息请参见stackoverflow.com/questions/20054028/…
    • 你是 100% 正确的。我以为他只是为了玩转框架而不打算在生产代码中这样做。我很容易假设太多,我应该提到这不是一个好主意。我会在那里编辑它。
    【解决方案2】:

    您只能通过范围调用控制器中的服务(这是将非 UI 逻辑与模板分离的想法)

    How to call a service function in AngularJS ng-click (or ng-change, ...)?

    $window 是一项服务,与其他与视图不直接相关的服务一样,它们无法在模板中访问。

    angular.module('app').controller('Controller', 
      ['$scope', '$window', function($scope, $window) {
          $scope.alert=$window.alert
    }]);
    

    【讨论】:

      猜你喜欢
      • 2014-01-23
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多