【问题标题】:Changing Ionic Menu side dynamically动态更改离子菜单侧
【发布时间】:2018-03-07 04:03:48
【问题描述】:

一旦用户更改语言,我正在尝试动态更改 Ionic 3 菜单端。 RTL 语言菜单需要在右侧,默认设置在左侧。

当语言改变app.components.ts时,我从@ngx-translate/core事件订阅TranslateService

this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
  console.info(`Language change to ${event.lang}`);
  this.isRTL = event.lang == 'ar' || event.lang == 'fa';

  if (event.lang == 'ar' || event.lang == 'fa') {
    this.platform.setDir('rtl', true);
    this.menuSide = 'right';
  } else {
    this.platform.setDir('ltr', true);
    this.menuSide = 'left';
  }

  this.platform.setLang(event.lang, true);
});

当我更改语言并按预期设置所有变量时,上面的代码将成功执行(我已经编写了单元测试以确保在应用程序运行时编写了大量的 console.logs。)

在模板中:

<ion-menu [content]="content" [side]="isRTL?'right':'left'" side="{{menuSide}}">
....
</ion-menu>

但是,即使控制器中的this.menuSide 发生了变化,它也不会按预期工作。

好像只有在platform.ready()之前才能换边,一旦platform.ready()设置好了,不管我怎么设置都不会生效。

编辑

我尝试使用https://stackoverflow.com/a/46417869/636136 中的方法,但也没有解决问题。

如果我只是在模板中打印menuSide,它将在屏幕上显示正确的值,但对菜单方向没有任何影响。

我可以通过浏览器元素检查器手动更改菜单元素上的“side”属性,它会成功更改方向,但是使用menuSide 变量将无法完成这项工作。

【问题讨论】:

    标签: angular typescript ionic-framework ionic3


    【解决方案1】:

    另一种解决方案,简单、流畅且效果极佳

    在 app.html 中

      <ion-content class="ttct-app-side-menu-content">
        <ion-list>
          <button menuClose ion-item *ngFor="let page of menuPages" (click)="openPage(page)">
            {{page}}
          </button>
        </ion-list>
      </ion-content>
    
    </ng-template>
    
    <ion-menu *ngIf="language === 'en'" type="overlay" side="right" [content]="content">
      <ng-container *ngTemplateOutlet="ttctSideMenuContent"></ng-container>
    </ion-menu>
    
    <ion-menu  *ngIf="language === 'ar'" type="overlay" side="left" [content]="content">
        <ng-container *ngTemplateOutlet="ttctSideMenuContent"></ng-container>
    </ion-menu>
    

    在 app.component.ts 中

    this.translateService.onLangChange.subscribe((event: LangChangeEvent) => {
          if(this.translateService.currentLang === 'en') {
            platform.setDir('ltr', true);
          } else {
            platform.setDir('rtl', true);
          }
          platform.setLang(this.translateService.currentLang, true);
            });
    .
    .
    .
    .
    .
      changeLanguage(lang) {
        this.translateService.use(lang);
        this.language = lang;
      }
    

    【讨论】:

      【解决方案2】:

      我可以通过HTMLElement 直接更改ion-menu 的一侧。 我知道不建议这样做,应该按照我在原始问题中尝试使其工作的方式来处理它,但在尝试了这么多不同的方式之后,我只能想到这些。

      我相信ion-menu 的问题及其在换边时的行为是一个错误。

      这是我为使其正常工作而进行的更改。

      app.component.ts

      export class MyApp {
        #...
        menuSide: string = "left";
      
        this.translate.onLangChange.subscribe((event: LangChangeEvent) => {
            console.info(`Language change to ${event.lang}`);
            let element: HTMLElement = document.getElementById("lovelyMenu");
      
            if (event.lang == 'ar' || event.lang == 'fa') {
              this.platform.setDir('rtl', true);
              this.menuSide = 'right';
            } else {
              this.platform.setDir('ltr', true);
              this.menuSide = 'left';
            }
      
            element.setAttribute("side", this.menuSide);
            this.platform.setLang(event.lang, true);
          });
        }
        ...
      }
      

      app.html:

      <ion-menu [content]="content" [side]="menuSide" id="lovelyMenu">
      ....
      

      【讨论】:

        【解决方案3】:

        使用property binding 而不是interpolation

        [side]="menuSide"

        <ion-menu [content]="content" [side]="menuSide">
        ....
        </ion-menu>
        

        【讨论】:

        • 我也用过,没用。我已经尝试了数百万种方法,但都没有奏效。如果我打开元素检查器,side 的值仍然是“左”,即使我控制台记录了该值并且它是“右”。问题是,如果我在platform.ready() 之前初始化“menuSide”,它将起作用,但在那之后就不行了。完整的源代码在github.com/SavandBros/gonevis-mobile/blob/master/src/app/…
        【解决方案4】:

        将 SIDE 密钥放入每个语言的 json 文件中,例如:

        ar.json

        “边”:“对”,

        和en.json

        "SIDE" : "左",

        然后在html中

         <ion-menu [content]="content" side="{{'SIDE' | translate}}"
        

        ....

        【讨论】:

        • 不,这也不起作用。奇怪的是,无论我尝试了多少种方法,离子菜单标签都没有任何变化。
        猜你喜欢
        • 2017-02-21
        • 2016-01-07
        • 1970-01-01
        • 2016-04-08
        • 2017-12-09
        • 2019-08-02
        • 2016-08-02
        • 2012-10-20
        • 2019-08-15
        相关资源
        最近更新 更多