Javascript 在不更改输入的情况下触发管道重新加载

Javascript 在不更改输入的情况下触发管道重新加载,javascript,angularjs,angular,Javascript,Angularjs,Angular,我正在angular 2中创建一个TranslationPipe,它以字符串作为输入,从TranslationService获取翻译并将其返回到视图。例如: {{'hello world'| translate}} 变成: 赫杰凡登 我想要一种方法来更改视图的语言,并在不重新加载整个页面的情况下更新页面上的所有文本。有没有办法触发重新加载页面上的所有TranslationPipes,甚至应用程序中的所有管道 通常,以角度触发管道的唯一方式是通过改变传递给管道的变量。输入是一个字符串,所以我需要手

我正在angular 2中创建一个
TranslationPipe
,它以字符串作为输入,从
TranslationService
获取翻译并将其返回到视图。例如:

{{'hello world'| translate}}

变成:
赫杰凡登

我想要一种方法来更改视图的语言,并在不重新加载整个页面的情况下更新页面上的所有文本。有没有办法触发重新加载页面上的所有
TranslationPipe
s,甚至应用程序中的所有管道

通常,以角度触发管道的唯一方式是通过改变传递给管道的变量。输入是一个字符串,所以我需要手动触发

存储所有翻译文本的文本对象存储在服务中,因此我知道另一种解决方案是这样做
translationObject['hello world]

但这对设计者来说可读性较差。

使用
pure:false
每次角度运行变化检测时都会对管道进行评估

@Pipe({
  name: 'xxx',
  pure: false
})
认为这相当昂贵


另一种方法是将语言作为附加参数传递,然后Angular也会在语言更改时计算管道。

管道可以有参数,即使您不需要这些参数(或不是所有参数),它们的更改也会触发管道
转换功能

// html
<p class="time-stamp">{{message.sent | timeAgo:trigger}}</p>

// component
trigger: number = 0;

ngOnInit() {
  setInterval(() => this.trigger = Math.random(), 60 * 1000)
}
//html

{{message.sent | timeAgo:trigger}

//组成部分 触发器:数字=0; 恩戈尼尼特(){ setInterval(()=>this.trigger=Math.random(),60*1000) }
like{{‘我的文本’| translate:languageVar}@GünterZöchbauer我有一个类似| filterargs:objectWithProperties的过滤器。仅当我使用您提到的不纯管道时,才会对该管道进行评估。但是它真的很贵。当objectWithProperties中的任何属性发生更改时,不会对管道求值。这取决于管道的作用。也许您可以缓存结果或使用
IterableDiffer
检查
objectWithProperties
的内容是否被修改。好的解决方案,请您解释一下math.random()在这段代码中的用法,以及为什么我们不只是像计数器一样递增它?@NejiSoltani您是对的,
触发器
增量也可以正常工作。除非Angular缓存管道生成的值,如果得到相同的输入值和参数(我不知道),则不再计算它们。在这种情况下,如果再次销毁并创建组件,可能会得到相同的结果。并不总是坏的,这取决于特定的用例。