我正在創建和角度4應用程序。恰巧我需要從我的URL中獲取不同深度級別的參數,從而導致我不能獲得參數。是否有可能以角度方式從ActivatedRoute中收集所有參數?
假設我們有這樣的URL:
https://mysite/companies/:companyID/cups/:cupId/drawings/:drawId
通常,根據角文檔,我們需要做的是這樣的:
ngOnInit() {
this.activatedRoute.parent.parent.params.subscribe((params: Params) =>
{this.companyId = params['companyId'];
});
this.activatedRoute.parent.params.subscribe((params: Params) =>
{this.cupId = params['cupId'];
});
this.activatedRoute.params.subscribe((params: Params) =>
{this.drawId = params['drawId'];
});
}
注意,這是考慮到我們是DrawDetailComponent內,這意味着我們在這個層次結構的最後一個子元素中。
另請注意,根據您在此層次結構中的深度,您將需要添加|減去.parent到您的activatedRoute以處於正確的位置,您可以成功獲得您正在尋找的參數。
那麼,是否有可能從你的網址使用同一個電話的所有參數?
喜歡的東西:
this.activatedRoute.parent.parent.params.subscribe((params: Params) =>
{this.companyId = params['companyId'];
{this.cupId = params['cupId'];
{this.drawId = params['drawId'];
});
我們希望有一個統一的,從我們的網址檢索所有的參數不依賴於深度的方式。
其實我們也嘗試過這樣的:
const property = 'companyId';
this.activatedRoute.pathFromRoot.forEach((item) => {
if (item.snapshot.params.hasOwnProperty(property)) {
item.params.subscribe((params: ParamMap) => {
this.companyId = params[property];
});
}
});
但是,我們希望找到一個更好的,更通用的,可測試的方式。
通常,在像Django這樣的框架中,開發人員能夠在一個步驟中收集來自url所需的所有信息。在Angular的情況下,訂閱可以自動處理這些參數的變化,但恕我直言,它遠不夠舒適+可測試。
通過父母迭代是你可以在這裏做的。你正在與框架戰鬥,路由器不應該這樣使用。 Angular不是Django。開發人員從A1路由器學到了一課。 A4路由器被設計成高度模塊化的,認爲這是一種封裝的特殊情況。兒童路線應該不瞭解父母,並通過「數據」,自己的參數和共同提供者來獲得他們需要的所有東西。應用程序設計可能存在XY問題,應該以另一種方式解決。 – estus
謝謝,有趣的答案,它指出我在另一個方向,可能是一個更合適的。你能不能分享一些描述這個XY問題的鏈接?另一方面,假設我們有4個組件,A,B,C,D,每個嵌套在前一個內部:A - > B - > C - > D,並且您需要用C來獲取數據3個父組件。是否應該通過在每個組件內部使用@Input來正確共享數據?D組件最終會有3個輸入,只能訪問來自父節點的簡單參數。 – pinkfloyd