从 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 2 ngClass:在尝试在 html 上显示 json 时获取预期表达式的插值 ()
iframe 中的 ng-src 属性不接受表达式?使用 Angular.js