【问题标题】:Accessing the window from Angular expression从 Angular 表达式访问窗口
【发布时间】:2014-01-26 17:04:51
【问题描述】:

根据developer guide,我应该能够使用$window 从Angular 表达式内部访问浏览器窗口。

与默认名称为全局窗口属性的 JavaScript 不同,Angular 表达式必须使用 $window 来引用全局窗口对象。例如,如果要调用定义在 window 上的 alert(),则必须在表达式中使用 $window.alert()。

但是,我似乎无法从使用$scope.$eval 评估的表达式中访问$window。 以下是我在退出控制台时得到的一些输出:

console.log($window);                   // the Window object as expected
console.log($scope.$eval('$window'));   // undefined
console.log($scope.$eval('1+1'));       // 2
console.log($scope.$eval('scopeVar'));  // 'abc'

控制器将$window 作为依赖项。我可以从表达式访问范围变量和其他服务,但不能访问 $window,所以 $scope.$eval($window.alert()) 也不起作用。

我在这里错过了什么?

【问题讨论】:

  • 如果你从 Angular 2+ 登陆这里,快速破解(如果你已经有一个 template variable #someElem 在周围)将是 someElem?.innerElement?.nativeElement?.ownerDocument.defaultView? 为了安全) -解析为底层Window

标签: angularjs angularjs-scope window-object


【解决方案1】:

$scope.$eval 会根据 $scope 进行评估,因此只有将 $window 服务分配给范围成员时,您的评估才会起作用:

$scope.$window = $window;  
console.log($scope.$eval('$window'));

【讨论】:

  • 这个答案是正确的,但似乎较新版本的 AngularJS(我在 1.2.4 上)由于安全原因不允许从表达式访问窗口对象,你会得到这个 [错误] (docs.angularjs.org/error/$parse:isecwindow?p0=$window.alert() 如果你尝试的话。好吧,我不能说文档是非常一致的......我将把警报调用包装在控制器函数中并从表达式中使用它。
  • 太好了,让开我的路,Angular!在这一点上,你可以只做$scope.window = window; 是的,你会失去可模拟性,但老实说,在这一点上,我很高兴绕过 Angular 并且可模拟性不是我们很快需要的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 1970-01-01
  • 2015-03-24
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 2015-07-13
相关资源
最近更新 更多