一尘不染

AngularJS:打开一个新的浏览器窗口,但仍保留作用域和控制器以及服务

angularjs

我正在编写一个angularJS应用。在这个特定的控制器中,我通过该$window.open服务打开一个新的浏览器窗口。但是在新窗口中,所有$scope变量都丢失了。

我尝试使用,window.parent但这不起作用。实际上,在新的浏览器窗口中,所有应用程序服务,控制器或作用域都根本无效,这是真的吗?有没有办法打开新的浏览器窗口,但仍然使新窗口与旧窗口属于同一个角度应用程序?我需要访问一些angularJS服务以及打开该新窗口的控制器范围。这有可能吗?


阅读 226

收藏
2020-07-04

共1个答案

一尘不染

没有使所有新窗口都属于同一个angular.js应用程序的方法,因为angular应用程序通常与通过ng-
app指令对其进行初始化的文档,窗口和窗口事件相关联或致电angular.bootstrap。

但是,您可以为弹出窗口创建新的角度模块和应用程序。通过包含适当的javascript文件,您可以使用原始应用程序中的相同基本服务和控制器。

假设弹出窗口需要原始应用程序中的数据,则可以使用window.open()方法返回的window对象传递该数据。例如,在第一个角度应用程序中,如下所示打开弹出窗口:

angular.module('originalModule').service('popupService', function(someOtherDataService) {

  var popupWindow = window.open('popupWindow.html');
  popupWindow.mySharedData = someOtherDataService.importantData;

});

辅助“弹出式”角度应用程序一旦初始化,便可以通过读取window.mySharedData来引用共享数据。

您还可以在每个窗口中创建可以从另一个窗口调用的函数。弹出窗口可以使用window.opener属性来回调到原始窗口。(window.parent指框架的父窗口,需要window.opener)

[同意,如果您研究了角度源代码,我敢肯定,您会找到在两个窗口中使用相同角度应用的巧妙方法。今晚我无法实现这样的尝试。]

2020-07-04