从 Angular 表达式访问窗口

Posted

技术标签:

【中文标题】从 Angular 表达式访问窗口【英文标题】:Accessing the window from Angular expression 【发布时间】: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 【参考方案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 并且可模拟性不是我们很快需要的东西。

以上是关于从 Angular 表达式访问窗口的主要内容,如果未能解决你的问题,请参考以下文章

Angular中的表达式创建$watch 的Scope 函数

表达式的 Angular 惰性一次性绑定

Angular 2 ngClass:在尝试在 html 上显示 json 时获取预期表达式的插值 ()

iframe 中的 ng-src 属性不接受表达式?使用 Angular.js

在 Angular + Electron 应用程序中使用 sqlite3:关键依赖项:依赖项的请求是一个表达式

Angular JS - 3 - Angular JS 双向数据绑定