25

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

这是我的动画触发器的精简版

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. 是否支持布尔值作为触发器?
  2. 如果是#1,我做错了什么?
4

3 回答 3

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

这里看那个笨蛋

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'))
])
于 2016-11-08T06:39:06.037 回答
3

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

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

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

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

于 2016-11-02T03:27:00.917 回答
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>

这里最好的建议是使用与其真正含义相对应的状态。在这种情况下,真假到底意味着什么?

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

于 2018-09-04T19:03:00.160 回答