所以,我有两个单页面应用程序,这两个应用程序都包含一个项目列表,在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)
,但我真的不知道它是如何运作的,或者它是否适用于我的应用程序(它们都是单页应用),所以进一步解释这将是很好的
答案 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');