GVKun编程网logo

Angular 路由器:带参数的 loadChildren(angular路由配置)

1

对于Angular路由器:带参数的loadChildren感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍angular路由配置,并为您提供关于AndroidAuto:如何在MediaBrows

对于Angular 路由器:带参数的 loadChildren感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍angular路由配置,并为您提供关于Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?、Angular 12.0.5 HMR 不工作,不重新加载模块,不重新加载页面实时重新加载,Angular 11.0.6 重新加载整个页面 调查 Angular 构建系统使用的版本配置 webpack使用 Angular 12.0.5 / next.6 时 - 没有帮助、Angular App-Routing LoadChildren 找不到模块、Angular Hybrid:LoadChildren 和升级组件出错的有用信息。

本文目录一览:

Angular 路由器:带参数的 loadChildren(angular路由配置)

Angular 路由器:带参数的 loadChildren(angular路由配置)

如何解决Angular 路由器:带参数的 loadChildren

在我的角度路由器中,我想根据 url 中的参数延迟加载不同的模块。这是我设置的伪路由:

  1. path: '':slug'',loadChildren: async () => {
  2. const SLUG = "How do I get the :slug param from the URL"?;
  3. switch (SLUG) {
  4. case ''first'':
  5. return (await import(''./pages/first-page/first-page.module'')).FirstPageModule;
  6. break;
  7. case ''second'':
  8. return (await import(''./pages/second-page/second-page.module'')).SecondPageModule;
  9. break;
  10. default:
  11. return (await import(''./pages/default-page/default-page.module'')).DefaultPageModule;
  12. }
  13. },

我尝试使用解析器和守卫——不幸的是它们在路由激活后触发,因此我无法事先访问参数。有什么想法吗?

解决方法

slug 创建单个模块,例如: const routes: Routes = [ { path: ''slug'',loadChildren: () => import(''./slug/slug.module'').then(m => m.SlugModule) } ]; 然后,在 SlugModule 中,为以下组件添加路由: const routes: Routes = [ { path: ''first'',component: FirstComponent },{ path: ''second'',component: SecondComponent } ];

Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?

Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?

如何解决Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?

我目前正在尝试实施 MediabrowserService 以构建适用于 Android Auto 的媒体应用。 我按照官方 Android Auto 文档 (https://developer.android.com/training/cars/media#onLoadChildren) 来实现onLoadChildren 功能。

以下是我尝试在 Android Auto 屏幕上显示内容的代码片段:

override fun onLoadChildren(parentId: String,result: Result<MutableList<MediabrowserCompat.MediaItem>>) {
  ...
  if (parentId == NODE_LIBRARY_ALBUMS) {
    val items = mutablelistof<MediabrowserCompat.MediaItem>()

    val albumList = LibraryManager.getAlbumList()
    for (it in albumList) {
      val descriptionBuilder = MediaDescriptionCompat.Builder()
        .setTitle(it.albumName)
      items.add(MediabrowserCompat.MediaItem(descriptionBuilder.build(),MediabrowserCompat.MediaItem.FLAG_broWSABLE))
    }

    result.sendResult(items)
  }
  ...
}

当项目数量足够小时,这很有效。 但是当item数量很大时(比如5000左右),会出现如下错误:

E/JavaBinder: !!! Failed BINDER TRANSACTION !!!  (parcel size = 1339384)

我发现支持 Android Auto 的其他几个媒体应用程序(例如三星音乐)可以显示大量项目。 有没有什么办法可以在onLoadChildren函数上返回大量的项目,或者有没有其他办法可以解决这个问题?

谢谢!

解决方法

可能您必须将大数据拆分为小块。例如,您有一个包含 5000 个项目的列表。所以在你的内心,MediaBrowserService 中的 onLoadChildren 做这样的事情

 public fun onLoadChildren(parentId: String,result: Result<List<MediaBrowserCompat.MediaItem>>) {
       
    if (MEDIA_ID_ROOT == parentId || itemsList.size > 100) {
        fillMediaBrowsableResult(parentId,result);
    }
    else {
        fillMediaPlayableResult(parentId,result);
    }
}


//Split the large number of content to a parts
private fun fillMediaBrowsableResult(parentId: String,result: Result<List<MediaBrowserCompat.MediaItem>>) {

    // Detect count of parts
    val partsCount = itemsList.size / 100
    if(itemsList.size % 100 > 0){
        partsCount ++
    }
    val mediaItems = mutableListOf<MediaBrowserCompat.MediaItem>()
    //Create parts in a loop
    for(i in 0 until partsCount){
        
         val mediaDescription = MediaDescriptionCompat.Builder()
                .setMediaId(i) // This is your next parent in onLoadChildren when you click on it in AA
                .setTitle("Part ${i + 1}")
                .build();

        val mediaItem =. MediaBrowserCompat.MediaItem(mediaDescription,MediaBrowserCompat.MediaItem.FLAG_BROWSABLE)
        mediaItems.add(mediaItem)
    }
    result.sendResult(mediaItems)
}

private fun fillMediaPlayableResult(parentId: String,result: Result<List<MediaBrowserCompat.MediaItem>>){

    val intParent = parentId.toInt()
    val startPosition = intParent * 100 // where to start for this part
    val stopPosition = (intParent + 1) * 100 // where to finish for this part
    if(stopPosition > itemsList.size){
        stopPosition = itemsList.size 
    }
    
    val mediaItems = mutableListOf<MediaBrowserCompat.MediaItem>()
    for(i in startPosition..stopPosition){
        //Generate playable content for this part
        val item = itemsList[i]
        val mediaDescription = MediaDescriptionCompat.Builder()
                    .setMediaId(item.id)
                    .setTitle(item.albumTitle)
                    .build();
        val mediaItem =. MediaBrowserCompat.MediaItem(mediaDescription,MediaBrowserCompat.MediaItem.FLAG_PLAYABLE)
        mediaItems.add(mediaItem)
    }
    result.sendResult(mediaItems)
}
 

我没有检查这段代码,但我认为这个想法很清楚。

,

如果您查看 Android SDK document:

注意:Android Auto 和 Android Automotive OS 对如何 他们可以在菜单的每个级别中显示许多媒体项。这些 限制最大程度地减少对驾驶员的干扰并帮助他们操作您的 带有语音命令的应用程序。 ...

所以,我认为最好的方法是限制用户体验设计中媒体项目的数量。对于您在处理大量媒体项目的其他应用中看到的情况,他们可能将 Jetpack Media 2 用于 pagination。

Angular 12.0.5 HMR 不工作,不重新加载模块,不重新加载页面实时重新加载,Angular 11.0.6 重新加载整个页面 调查 Angular 构建系统使用的版本配置 webpack使用 Angular 12.0.5 / next.6 时 - 没有帮助

Angular 12.0.5 HMR 不工作,不重新加载模块,不重新加载页面实时重新加载,Angular 11.0.6 重新加载整个页面 调查 Angular 构建系统使用的版本配置 webpack使用 Angular 12.0.5 / next.6 时 - 没有帮助

如何解决Angular 12.0.5 HMR 不工作,不重新加载模块,不重新加载页面实时重新加载,Angular 11.0.6 重新加载整个页面 调查 Angular 构建系统使用的版本配置 webpack使用 Angular 12.0.5 / next.6 时 - 没有帮助

Angular HMR 不替换/重新加载组件

  • 实时重载适用于 11.0.6 和 12.1.0-next.6。
  • Angular 12.0.5 根本不会重新加载。

任何人都可以使用它并且可以提供一个有效的示例应用程序?

给定:一个简单的入门应用

(来自故事书 https://github.com/chromaui/intro-storybook-angular-template)

使用 Angular 11.0.6

然后 HMR 开箱即用并不能按预期工作,但完全重新加载可以(即启用 [WDS] 实时重新加载。)

更新到 Angular 12.0.5 时

然后 HMR 不会重新加载任何东西。 (根本没有实时重新加载)

12.0.5 行为:更新角度组件时不重新加载。

控制台错误(chrome):

dev-server.js:60 Uncaught Error: [HMR] Hot Module Replacement is disabled.
    at Object.5033 (dev-server.js:60)
    at __webpack_require__ (bootstrap:19)
    at __webpack_exec__ (polyfills.js:12907)
    at polyfills.js:12908
    at webpackJsonpCallback (jsonp chunk loading:35)
    at polyfills.js:1

编辑组件 (HTML) 后,控制台“卡住”“[WDS] 应用热更新...”

更新到 Angular 12.1.0-next.6 时"

结果与 v11 相同(然后 HMR 开箱即用,但完全重新加载可以(即启用 [WDS] 实时重新加载。)

webpack-dev-server 是原因(可能与 webpack 5.3 一起)

经过一番挖掘,我意识到这与 webpack-dev-server 有关。

  • https://github.com/webpack/webpack-dev-server/issues/2758

一个解决方案似乎是将 webpack 目标设置为 web(而不是浏览器)进行开发。或者使用测试版的 webpack-dev-server(即 4.0.0-beta.x)

"target: ''web'',

调查 Angular 构建系统使用的版本

在“node_modules/@angular-devkit/build-webpack/package.json”中使用了 webpack-dev-server。

对于 "@angular-devkit/build-angular": "~12.0.5",webpack-dev-server 版本为 3.11.2

"peerDependencies": { "webpack": "^5.30.0","webpack-dev-server": "^3.11.2" },

将 Angular 更新为 v-next 时 对于 "@angular-devkit/build-angular": "^12.1.0-next.6",webpack-dev-server 版本较低,为 3.1.4,与 ''build-angular'' v11 相同。 (可能是因为他们意识到实时重新加载的问题)

"peerDependencies": { "webpack": "^5.30.0","webpack-dev-server": "^3.1.4" },

使用 Angular 11 时 对于“@angular-devkit/build-angular”:“~0.1100.6”

"peerDependencies": { "webpack": "^4.6.0",

配置 webpack(使用 Angular 12.0.5 / next.6 时) - 没有帮助

根据以下资源配置,使用@angular-builders/custom-webpack

没有帮助。帮助! =D

  • https://github.com/just-jeb/angular-builders/tree/master/packages/custom-webpack#Custom-webpack-dev-server
  • https://github.com/just-jeb/angular-builders/blob/master/packages/custom-webpack/examples/full-cycle-app/extra-webpack.config.ts
//package.json
"devDependencies": {
    "@angular-builders/custom-webpack": "^12.1.0",
//angular.json
//replace "builder" in "build" and "serve"
//add customWebpackConfig with path to a new config file
//"builder": "@angular-devkit/build-angular:browser"
    "architect": {
        "build": {
          "builder": "@angular-builders/custom-webpack:browser","options": {
            "customWebpackConfig": {
              "path": "extra-webpack.config.ts","replaceDuplicatePlugins": true
           },//...
         //replace   "builder": "@angular-devkit/build-angular:dev-server","serve": {
           "builder": "@angular-builders/custom-webpack:dev-server",
//extra-webpack.config.ts
import { Configuration } from "webpack";

export default {
    target:"web",// target: process.env.NODE_ENV === "development" ? "web" : "browserslist",} as Configuration;

解决方法

我们有一些与您介绍的类似的东西。您是否删除了 package_lock、node_modules 并进行了全新安装?

在 Angular 11.2.4 和新的 Angular 12.1.4 项目中,使用 HRM 进行设置没有问题。 尝试使用 "@angular-builders/custom-webpack": "12.1.0","@angular-devkit/build-angular": "^12.1.4" 它应该可以工作

Angular App-Routing LoadChildren 找不到模块

Angular App-Routing LoadChildren 找不到模块

如何解决Angular App-Routing LoadChildren 找不到模块

我是 Angular 的新手,正在学习视频教程。我被困在 App-Rounting 上,它试图加载子组件。这是到目前为止的代码

app-routing.module.ts

import { NgModule } from "@angular/core";
import { CommonModule } from "@angular/common";
import { RouterModule,Routes } from "@angular/router";

import { HomeComponent } from "./home/home.component";

const appRoutes: Routes = [
  { path: "",component: HomeComponent },{
    path: "customers",loadChildren: "../app/customers/customers.module#CustomersModule"
  }
];

@NgModule({
  imports: [CommonModule,RouterModule.forRoot(appRoutes)],// add the routes to import array
  exports: [RouterModule],// after import,export the RouterModule after adding appRoutes
  declarations: []
})
export class AppRoutingModule {} 

我尝试将 loadChildren: "../app/customers/customers.module#CustomersModule" 更改为 loadChildren: "app/customers/customers.module#CustomersModule"

文件树结构如下

src\\
  app\\
    app-routing.module.ts
    customers\\
      customers.module.ts
      customers.module.spec.ts

我不知道为什么它找不到并加载customers.module.ts。起初,我没有 customer.moudle.spec.ts 并添加了它,但它仍然在 chrome 控制台上抛出相同的错误。

节点版本为 v14.16.0 节点版本为 6.14.11

感谢这位新手的任何帮助。

谢谢

解决方法

我认为您的教程很旧,您必须使用 new syntax

const routes: Routes = [
  {
    path: ''items'',loadChildren: () => import(''./items/items.module'').then(m => m.ItemsModule)
  }
];

Angular Hybrid:LoadChildren 和升级组件出错

Angular Hybrid:LoadChildren 和升级组件出错

如何解决Angular Hybrid:LoadChildren 和升级组件出错

我正在尝试使用延迟加载的 Angular 模块创建一个混合应用程序(Angular + AngularJS)。

当我尝试使用包含升级的 AngularJS 组件的组件延迟加载模块时,出现以下错误:

路线

  1. const appRoutes: Routes = [
  2. {
  3. path: ''toto'',loadChildren: () => import(''./toto/toto.module'').then(module => module.TotoModule)
  4. }
  5. ];

错误

  1. Error: Uncaught (in promise): Error: Trying to get the AngularJS injector before it being set.
  2. Error: Trying to get the AngularJS injector before it being set.
  3. at injectorFactory (upgrade-static.umd.js:1266)
  4. at _callFactory (ng_module.ts:201)
  5. at _createProviderInstance (ng_module.ts:154)
  6. at resolveNgModuleDep (ng_module.ts:110)
  7. at NgModuleRef_.get (refs.ts:423)
  8. at Object.resolveDep (provider.ts:424)
  9. at Injector_.get (refs.ts:372)
  10. at new UpgradeHelper (upgrade-static.umd.js:1491)
  11. at new UpgradeComponent (upgrade-static.umd.js:1802)
  12. at new MyExampleDirective (VM270 toto.module.ts:13)
  13. at resolvePromise (zone.js:1255)
  14. at resolvePromise (zone.js:1209)
  15. at eval (zone.js:1321)
  16. at ZoneDelegate.invokeTask (zone.js:434)
  17. at Object.onInvokeTask (ng_zone.ts:390)
  18. at ZoneDelegate.invokeTask (zone.js:433)
  19. at Zone.runTask (zone.js:205)
  20. at drainMicroTaskQueue (zone.js:620)
  21. at ZoneTask.invokeTask [as invoke] (zone.js:520)
  22. at invokeTask (zone.js:1656)

当我在 AppModule 中导入模块并执行以下路由时,它工作正常:

  1. const appRoutes: Routes = [
  2. {
  3. path: ''toto'',children: TotoRoutes
  4. }
  5. ];

我创建了 2 个 stackblitz :

  • 使用延迟加载,触发错误: https://stackblitz.com/edit/angular-uye3ld

  • 没有延迟加载的: https://stackblitz.com/edit/angular-3aogfs

今天关于Angular 路由器:带参数的 loadChildrenangular路由配置的介绍到此结束,谢谢您的阅读,有关Android Auto:如何在 MediaBrowserService 的 loadChildren() 上返回大量子项?、Angular 12.0.5 HMR 不工作,不重新加载模块,不重新加载页面实时重新加载,Angular 11.0.6 重新加载整个页面 调查 Angular 构建系统使用的版本配置 webpack使用 Angular 12.0.5 / next.6 时 - 没有帮助、Angular App-Routing LoadChildren 找不到模块、Angular Hybrid:LoadChildren 和升级组件出错等更多相关知识的信息可以在本站进行查询。

本文标签: