【问题标题】:Angular ui-router render different component based on route paramsAngular ui-router 根据路由参数渲染不同的组件
【发布时间】:2016-12-19 15:06:38
【问题描述】:

使用 Angular UI 路由器,我试图根据 $state.params 值呈现不同的组件,但我找不到一个干净的方法来做到这一点。

我已经想出了一个可行的解决方案(有点 ES2015 的幻想),但这远非最佳:

/* ----- chapter/chapter.controller.js ----- */
class ChapterController {

  constructor($state) {
    this.$state = $state;
    this.chapterNb = this.$state.params.chapterNb;
  }

}

ChapterController.$inject = ['$state'];

export default ChapterController;

/* ----- chapter/chapter.controller.js ----- */
import controller from './chapter.controller';

const ChapterComponent = {
  controller,
  template: `
    <chapter-01 ng-if="$ctrl.chapterNb === 1"></chapter-01>
    <chapter-02 ng-if="$ctrl.chapterNb === 2"></chapter-02>
  ` // and more chapters to come...
};

export default ChapterComponent;

/* ----- chapter/index.js ----- */
import angular from 'angular';
import uiRouter from 'angular-ui-router';

import ChaptersComponent from './chapters.component';
import ChaptersMenu from './chapters-menu';
import Chapter from './chapter';

const chapters = angular
  .module('chapters', [
    uiRouter,
    ChaptersMenu,
    Chapter
  ])
  .component('chapters', ChaptersComponent)
  .config($stateProvider => {
    'ngInject';
    $stateProvider
      .state('chapters', {
        abstract: true,
        url: '/chapters',
        component: 'chapters'
      })
      .state('chapters.menu', {
        url: '/menu',
        component: 'chaptersMenu'
      })
      .state('chapters.chapter', {
        url: '/{chapterNb:int}',
        component: 'chapter'
      });
  })
  .name;

export default chapters;

问题是每个&lt;chapter-0*&gt; 组件都非常不同,这就是为什么它们都对应于自己的模板。 我想找到一种方法来自动引用与 $state.params.chapterNb 对应的章节组件,而不必为每个章节编写 ng-if

有什么办法可以简化吗?或者也许有一个特定的功能可以用于此目的?

【问题讨论】:

    标签: javascript angularjs angular-ui-router angularjs-routing angular-components


    【解决方案1】:

    正如 Pankaj Parkar 在他的回答中所建议的,在这里使用模板函数会有所帮助。

    通过一些调整,我已经能够基于$state.params 加载正确的组件,所以这是我的解决方案,作为记录(查看第一篇文章以了解其他相关文件):

    import controller from './chapter.controller';
    
    const ChapterComponent = {
      controller,
      template: ($state) => {
        'ngInject';
        return `
          <chapter-0${$state.params.chapterNb}></chapter-0${$state.params.chapterNb}>
        `;
      }
    };
    
    export default ChapterComponent;
    

    【讨论】:

      【解决方案2】:

      如果您不向组件传递任何数据,我认为您可以执行以下操作。

      const ChapterComponent = {
        controller,
        template: ($state) => {
           return ['<chapter-', $state.chapterNb, '></chapter-', $state.chapterNb, '>'].join("")
        }
      };
      

      另一种方法是您可以为每个 chapter 维护单独的模板并有一些 URL 约定。此后,您可以使用componenttemplateUrl 函数或带有srcng-include 指令来呈现这些模板。

      【讨论】:

      • @ClementParis016 对您有帮助吗?
      • 嘿,对不起,我正在处理其他事情,但是是的,您的帮助非常有用,谢谢!我将发布工作解决方案作为答案;)
      • @ClementParis016 您正在使用的东西只是在字符串连接中进行调整,因为您在模板中使用interpolation,就是这样,谢谢:)
      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-26
      • 2021-08-08
      • 2020-09-20
      相关资源
      最近更新 更多