【问题标题】:Angular2 material sidenav - changing rtl/ltr direction dynamicallyAngular2材料sidenav - 动态改变rtl / ltr方向
【发布时间】:2017-03-02 00:42:53
【问题描述】:

我正在尝试根据用户的语言选择动态更改布局,并即时从 LTR 切换到 RTL。

我正在使用 Angular 2 rc6,材料 2.0.0-alpha.9-3

看起来当页面加载时,它可以完美地与 rtl 或 ltr 一起使用。 但是,当它从应用程序内部动态更改时(请参阅 plunker),方向会发生变化,但生成的元素 md-sidenav-content 具有错误计算的 margin-right 和 margin-left。

进一步挖掘,我设法看到 _dir 对象有一个 eventEmitter,它应该监视 _dir 的更改事件并重新计算边距

@angular/material/sidenav/sidenav.js:

_dir.dirChange.subscribe(function () { return _this._validateDrawers(); });

但是在动态改变方向时它永远不会被调用。 虽然,_dir 在第一次加载页面时保持正确的值,无论是它的 ltr 还是 rtl。

最后,这是一个演示行为的 plunker:

http://plnkr.co/edit/o8lXWC?p=preview

我怀疑我没有正确使用 _dir,但没有设法找出正确的方法。

【问题讨论】:

    标签: angular angular-material2 right-to-left


    【解决方案1】:

    我不确定我对 angular1 所做的是否也适用于 angular 2。 那只是添加一个 CSS:

    md-sidenav {
        left: initial;
        right: 0;
    }
    md-sidenav.md-closed {
        transform: translate3d(100%, 0, 0);
    }
    

    现在只为那些具有 rtl 方向的人提供它,向正文添加一个类/属性然后只选择它就足够了。

    【讨论】:

      【解决方案2】:

      看看源代码Dir指令

      @Input('dir') _dir: LayoutDirection = 'ltr';
      

      如您所见,您正在更改 _dir 属性而不是 dir setter:

      set dir(v: LayoutDirection) {
        let old = this._dir;
        this._dir = v;
        if (old != this._dir) {
          this.dirChange.emit(null);
        }
      }
      

      所以我认为你的解决方案应该是这样的:

      查看

      <md-sidenav-layout fullscreen dir="ltr" #root="$implicit">
      
      <select #langSelect (change)="changeLang(langSelect.value, root)">
      

      组件

      changeLang(lang, root: Dir) {
        this.translate.use(lang);
        root.dir = lang == "fr" ? "rtl" : "ltr";
      }
      

      这样你可以在你的组件上省略direction: string 属性。

      还有一个注意事项:

      translate: TranslateService; //it's redundant `private translate: TranslateService` does it
      direction: string; // omit it
      
      constructor(private translate: TranslateService) {
        this.direction = "ltr"; // omit it
        translate.addLangs(["en", "fr"]);
        translate.setDefaultLang('en');
      
        let browserLang = translate.getBrowserLang();
        translate.use(browserLang.match(/en|fr/) ? browserLang : 'en');
        this.translate = translate; // it's redundant
      }
      

      这是你的Plunker Example

      如果您认为这是错误的决定,请检查此

      希望对您有所帮助!

      【讨论】:

      • 这看起来很有希望!我得玩一会儿,因为我的应用程序不像 plunker 那样简单。感谢您的领导,我会更新结果。
      • 这成功了!非常感谢你让我朝着正确的方向前进。
      【解决方案3】:

      我一直在尝试使用“end”和“start”对齐属性来解决问题,但我不知道为什么它不可能。 我认为一个可能的解决方案是你“玩”一下 NgStyle 和 margin-right,就​​像我在下面的 Plnkr 中展示的那样

      [ngStyle]="{'margin-right': move}"
      

      example

      希望这可能有用。

      【讨论】:

      • 问题是这可能在表面上起作用(如果我的页面上没有很多内容)但主要问题是生成的 md-sidenav-content 元素包含所有内容仍然有不正确的左边距,所以我的内容永远无法达到页面的全长。请参阅我的意思的屏幕截图。 !Margin screenshot
      猜你喜欢
      • 1970-01-01
      • 2015-01-05
      • 1970-01-01
      • 2015-09-01
      • 2016-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多