私は問題の完全な例を持つgithubリポジトリを作成しました。生成後に作成された角度ルートが配列にプッシュ
https://github.com/rjriel/dynamic-route-example
開発にこのコードを実行すると、このリポジトリ内のコードの重要な部分(すなわち。ng serve
)app.module.ts
let mainRoutes: Routes = [{
path: "first",
component: FirstComponent
}]
mainRoutes.push({
path: "second",
component: SecondComponent
})
@NgModule({
...
imports: [
RouterModule.forRoot(mainRoutes),
にある両方のルートを正しくナビゲートします。しかし、(すなわちng serve --prod
。)の生産にこのコードを実行すると、次のエラーでmainRoutes.push
結果によって追加されましたsecond
ルート:それが動作しながら、
ERROR Error: Uncaught (in promise): Error: Cannot match any routes. URL
Segment: 'second'
Error: Cannot match any routes. URL Segment: 'second'
at t.BkNc.t.noMatchError (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.selector (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at t.BkNc.t.noMatchError (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.selector (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e.error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.T14+.e._error (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at u (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at u (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at polyfills.8c1e4b56978ce6347832.bundle.js:1
at e.invokeTask (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at Object.onInvokeTask (vendor.0828fd59ec5e6a599e72.bundle.js:1)
at e.invokeTask (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at r.runTask (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at o (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at t.invokeTask [as invoke] (polyfills.8c1e4b56978ce6347832.bundle.js:1)
at h (polyfills.8c1e4b56978ce6347832.bundle.js:1)
は、誰もが生産用にコンパイルすると、このエラーを生成する理由を知ることが起こるだろう開発は完全にうまい?または少なくともデバッグのためのより良い方法は?
編集:
は、私がここでやっているの現実の実装では、私が情報の同じレイアウトとサイト上の複数のページを持っているということですので、私はどこオブジェクトであるJSONファイルを作成各キーは経路であり、値は経路に関する情報である。それから私は、JSONをロードし、次に示すように、ルートを追加します。
import * as PageLayouts from '../page-layouts.json'
import { MainLayoutComponent } from './main-layout/main-layout.component'
Object.keys(PageLayouts).forEach(key => {
mainRoutes.push({
path: key,
component: MainLayoutComponent
})
})
私は上記のforEach後console.log(mainRoutes)
を行うと、予想通り、アレイ内のすべてのルートを参照してください。また、説明のために、このコード例に示すように、このforEach
ループが@NgModule
宣言の前に実行されます。これは開発のためのJiTコンパイルではすべて正常に動作しますが、生産のためのAoTコンパイルでは上記の問題があります。
私は、AOT対JiTを認識しており、それが違いがあった理由が分かっていたと言います。 '.push'を呼んだ後に配列のconsole.logを置くと、配列内のすべてのオブジェクトが表示されます。これがなぜルートに読み込まれないのか混乱してしまいます。私が実際にやっていることの基本的な説明は、同じレイアウトの私のサイトに複数のページがあるので、それらのコンテンツをjsonファイルに置き、そこからルート/情報を読み込み、同じコンポーネントを利用します。質問を例で更新する – flamebaud