打开新窗口,在该窗口中运行$ scope函数,这是一种更好的方法

时间:2016-07-07 07:31:03

标签: javascript jquery angularjs

所以,我有两个单页面应用程序,这两个应用程序都包含一个项目列表,在Application A我们有List A,在Application B我们有List B

List A中的项目可以是List B中的项目的父项,一对多关系。

如果用户点击App A中的某个项目,他会选择view related items,这将在单独的窗口(新标签页)中打开App B,并过滤{{1仅显示List B中所点击项目的相关项目。

这意味着我必须打开一个新窗口,并在该窗口准备就绪时运行一个函数,并传递所单击项目的App A以过滤我的列表。

ID

函数$scope.openNewWindow = function(id){ var popup = window.open('newPageUrl'); // check to see when opened page is ready var readyStateCheckInterval = setInterval(function() { if (popup.document.readyState === "complete") { clearInterval(readyStateCheckInterval); // function on App B popup.functionToRunWhenReady(id); } }, 50); }; 是一个javascript函数,必须运行实际函数来过滤我的列表,这是一个functionToRunWhenReady()函数,原因是我无法访问来自我的其他应用程序的$scope函数

$scope

正如您在此处所见,我检查function functionToRunWhenReady(id) { angular.element(document).ready(function () { var scope = angular.element($('#myAppDiv')).scope(); scope.$apply(function() { // scope function to filter the list scope.setFilter(id); }); }); } 是否准备就绪,通过执行document访问scope,然后运行我的var scope = angular.element($('#myAppDiv')).scope();功能

这样可行,但我无法相信这是解决此问题的最佳方式。

tl; dr 如何打开一个新窗口,然后在新应用程序上运行$ scope函数,这种做法不是很糟糕?

修改:我看到有人建议setFilter(id),但我真的不知道它是如何运作的,或者它是否适用于我的应用程序(它们都是单页应用),所以进一步解释这将是很好的

3 个答案:

答案 0 :(得分:3)

将ID作为GET参数发送到应用程序B.然后,您可以使用$ routeParams直接在控制器中访问它,而不会有任何延迟。

答案 1 :(得分:2)

在应用程序A中,您不需要任何特殊代码来打开窗口。只是标记中的target="blank"链接。

<a href="http://applicationB_url/{{itemA.id}}/items" target="blank">{{itemA.name}}</a>

然后在应用B中,根据您的路由器,使用$stateParams(对于ui router)或$routeParams来访问控制器中的ID。

如果要在启动时运行某个功能,只需检查Application B控制器中是否存在该ID。类似的东西:

if($stateParams.id) {
   // do something
}

答案 2 :(得分:2)

I would recommend changing the redirect to be the following var popup = window.open('newPageUrl?id=' + id);

and then on the second webpage, just parse the id out of the url:

var search = document.location.href;
var id = JSON.parse('{"' + decodeURI(search).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')['id'];

A better alternative would be to store the data as a cookie cookiesave('id', id); and then var id = cookieget('id');