2017-07-26 46 views
0

我正在創建和角度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的情況下,訂閱可以自動處理這些參數的變化,但恕我直言,它遠不夠舒適+可測試。

+0

通過父母迭代是你可以在這裏做的。你正在與框架戰鬥,路由器不應該這樣使用。 Angular不是Django。開發人員從A1路由器學到了一課。 A4路由器被設計成高度模塊化的,認爲這是一種封裝的特殊情況。兒童路線應該不瞭解父母,並通過「數據」,自己的參數和共同提供者來獲得他們需要的所有東西。應用程序設計可能存在XY問題,應該以另一種方式解決。 – estus

+0

謝謝,有趣的答案,它指出我在另一個方向,可能是一個更合適的。你能不能分享一些描述這個XY問題的鏈接?另一方面,假設我們有4個組件,A,B,C,D,每個嵌套在前一個內部:A - > B - > C - > D,並且您需要用C來獲取數據3個父組件。是否應該通過在每個組件內部使用@Input來正確共享數據?D組件最終會有3個輸入,只能訪問來自父節點的簡單參數。 – pinkfloyd

回答

1

認爲你應該能夠做這樣的事情:

this.activatedRoute.params.subscribe(params => { 
    this.companyId = params['companyId']; 
    this.cupId = params['cupId']; 
    this.drawId = params['drawId']; 
}); 

我曾在我的應用程序類似於此的運氣。請注意,我不會去父母。激活的路線應該有你需要的一切。

希望這會有所幫助!

+1

我同意。我知道這是有例外的。但是當人們想要「鬆散」的路由功能時,我總會畏縮一點。動態路由有明確的用例,但在動態嵌套動態的地方不會太多。在整個應用程序中,根據設計運行,您的路由應該是最可預測和一致的。 – joshrathke

+0

@R。理查茲,這不適合我們。請注意我們在這裏有嵌套路線。假設你有一個模塊,在這種情況下,CompanyModule有一個子模塊:CupModule,每個模塊都有自己的路由。當你從CupModule中的任何一個組件內部詢問activatedRoute時,它不知道父模塊的路由。這就是爲什麼在這個例子中,我們有3個不同級別的.parent嵌套請求,這取決於深度。 – pinkfloyd

+0

@joshrathke,通常在像Django這樣的框架中,只需要一個簡單的調用就可以隨時獲得所有參數。我認爲這在Angular中不是一個完全成熟的功能。也許有這個問題的一些答案,我會改變主意:) – pinkfloyd

相關問題