2016-07-07 94 views
4

因此,一個$範圍功能,我有兩個單頁的應用程序,這兩個應用程序都包含項目的列表,在Application A我們有List A,並在Application B我們有List B打開新窗口,運行在該窗口中,更好的辦法

List A的物品可以是用於項目父在List B,一對多的關係。

如果用戶點擊App A一個項目,他得到選項view related items,這將在單獨的窗口(新標籤)開拓App B,並在App A過濾List B,只顯示相關項目的點擊項目。

這意味着我必須打開一個新窗口,並在該窗口準備就緒時運行一個函數,並通過點擊項目的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); 
}; 

功能,functionToRunWhenReady()是一個JavaScript功能,並具備運行實際功能來過濾我的名單,這是一個$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準備好了,通過做var scope = angular.element($('#myAppDiv')).scope();訪問scope,然後運行我setFilter(id)功能

這有效,但我不能相信這是最好的方式去做這件事。

tl; dr我該如何打開一個新窗口,然後在新應用程序上運行$ scope函數,這種方式並不是不好的做法?

編輯:我看到人們所提出的建議$routeparams,但我真的不知道如何工作的,或者如果它在我的應用程序工作(他們都是單頁的應用程序),那這樣進一步說明會是偉大的

+0

難道你不能將這兩個頁面分成一個角度應用程序? – Chinni

+0

@Chinni這是我的第一個方法,但第二個應用程序被廣泛使用,並且只在某些情況下是與第一個應用程序中的列表相關的項目 – klskl

回答

3

發送ID作爲GET參數嚮應用B然後,您可以直接訪問它的控制器不使用$ routeParams任何延誤。

2

在應用程序A,你不需要任何特殊代碼打開了一扇窗。您的標記中只有一個target="blank"鏈接。

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

然後在應用程序B,這取決於你的路由器上,使用$stateParams(用於ui router)或$routeParams訪問ID在你的控制器。

如果你想運行在啓動功能,只需檢查該ID在你的應用程序B控制器的存在。喜歡的東西:

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

我將建議改變重定向爲以下 var popup = window.open('newPageUrl?id=' + id);

,然後在第二個網頁,只是解析標識出的URL:

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

一更好的替代方法是將數據存儲爲曲奇 cookiesave('id', id); 然後 var id = cookieget('id');