Angular 2 Animation - 布尔触发器?

时间:2016-10-31 11:06:19

标签: angular typescript angular2-animation

我试图触发绑定到布尔属性的转换,但这似乎没有触发。

以下是我的动画触发器的缩减版

trigger(
  'trueFalseAnimation', [
    transition('* => true', [
      style({backgroundColor: '#00f7ad'}),
      animate('2500ms', style({backgroundColor: '#fff'}))
    ]),
    transition('* => false', [
      style({backgroundColor: '#ff0000'}),
      animate('2500ms', style({backgroundColor: '#fff'}))
    ])
  ]
)

HTML:

<div [@trueFalseAnimation]="model.someProperty">Content here</div>

测试:

ngOnInit() {

    setTimeout(() => {
        this.model.someProperty = true;
        setTimeOut(() => {
            this.model.someProperty = false;
        }, 5000);    
    }, 1000)
}

someProperty发生变化时,触发器永远不会发生。

作为快速测试,我更改了触发器以使用字符串并且它可以正常工作

trigger(
      'trueFalseAnimation', [
        transition('* => Success', [
          style({backgroundColor: '#00f7ad'}),
          animate('2500ms', style({backgroundColor: '#fff'}))
        ]),
        transition('* => Failed', [
          style({backgroundColor: '#ff0000'}),
          animate('2500ms', style({backgroundColor: '#fff'}))
        ])
      ]
    )

测试:

ngOnInit() {

    setTimeout(() => {
        this.model.someProperty = "Success";
        setTimeOut(() => {
            this.model.someProperty = "Failed";
        }, 5000);    
    }, 1000)
}

第二个例子很好用

我的问题是

  1. 是否支持boolean作为触发器?
  2. 如果是#1,我是什么人 做错了?

3 个答案:

答案 0 :(得分:25)

  1. 似乎没有。我看到一个问题(12337)已经提出来了 为此,但到目前为止还没有更新。
  2. 另一种选择是使用1和0而不是true和false。
  3. 查看plunker中的here

    trigger('isVisibleChanged', [
          state('true' , style({ opacity: 1, transform: 'scale(1.0)' })),
          state('false', style({ opacity: 0, transform: 'scale(0.0)'  })),
          transition('1 => 0', animate('300ms')),
          transition('0 => 1', animate('900ms'))
    ])
    

答案 1 :(得分:3)

我有同样的问题。不确定是否支持boolean作为触发器,但我发现的解决方法是使用getter定义一个字符串属性,以将boolean值作为字符串返回。像这样:

get somePropertyStr():string {
    return this.someProperty.toString();
}

然后,您应该将动画绑定到somePropertyStr属性。

再一次,这是一个丑陋的解决方法,最好能够使用布尔值。

答案 2 :(得分:1)

状态被定义为字符串,因此我们必须坚持。

基于代码的最简单但最讨厌的方式是

<div [@trueFalseAnimation]="model.someProperty?.toString()">Content here</div>

但这太糟糕了,所以可能更好

<div [@trueFalseAnimation]="model.someProperty ? 'active' : 'inactive'">Content here</div>
<div [@trueFalseAnimation]="model.someProperty ? 'visible' : 'hidden'">Content here</div>
<div [@trueFalseAnimation]="model.someProperty ? 'up' : 'down'">Content here</div>
<div [@trueFalseAnimation]="model.someProperty ? 'left' : 'right'">Content here</div>

这里最好的建议是使用与其实际含义相对应的状态。在这种情况下,对与错的真正含义是什么?

我考虑过使用管道来转换布尔值,但是这样做的唯一好处是确保您与状态字符串保持一致。