Javascript 强制从valueconverter中更新视图

Javascript 强制从valueconverter中更新视图,javascript,aurelia,Javascript,Aurelia,昨天有人在gitter上发布了这个。我最近遇到了同样的问题。由于这是一个常见的用例,我只是在这里再次发布他的问题,这样它就不会在gitter宇宙中丢失。。。 有没有一种简单的方法可以强制ValueConverter始终为每个fromView调用toView?我有一个我正在使用的ValueConverter,它只能钳位到整数。它可以工作,但有一个奇怪的转折:如果我将其从0更改为1.5并单击“离开”(这里也使用UpdateRigger:“模糊”),它会正确地将1存储在VM中,然后将输入值也更改为1。

昨天有人在gitter上发布了这个。我最近遇到了同样的问题。由于这是一个常见的用例,我只是在这里再次发布他的问题,这样它就不会在gitter宇宙中丢失。。。 有没有一种简单的方法可以强制ValueConverter始终为每个fromView调用toView?我有一个我正在使用的ValueConverter,它只能钳位到整数。它可以工作,但有一个奇怪的转折:如果我将其从0更改为1.5并单击“离开”(这里也使用UpdateRigger:“模糊”),它会正确地将1存储在VM中,然后将输入值也更改为1。但是如果我将其从1更改为1.5,它会更新VM,但是由于VM中的值似乎没有更改,因此它不会更新输入(没有调用toView)。 我知道我可以用事件侦听器和信号来解决这个问题,但这感觉太过分了。
谢谢

如果要添加“行为”,最好使用绑定行为。这将给你更多的控制,你甚至可以控制光标,等等

整数输入绑定行为.js

import {BindingSignaler} from 'aurelia-binding';

// grab a reference to the signaler
constructor(signaler: BindingSignaler) {
    this.path = [[0,0]];
    this.signaler = signaler;
}

// and fire the signal event bound in your view
// whenever the data behind the valueConverter changes
updatePath(position) {
    this.path.push(position);
    this.signaler.signal('update-view');
}
导出类IntegerInputBindingBehavior{
绑定(绑定,源){
binding.standardUpdateSource=binding.updateSource;
binding.updateSource=函数(值){
常量intValue=parseInt(值,10);
if(isNaN(intValue)){
此.standardUpdateSource(0);
返回;
}
此.standardUpdateSource(intValue);
if(intValue.toString(10)!==值){
this.updateTarget(intValue.toString(10));
}
};
}
解除绑定(绑定,源){
binding.updateSource=binding.standardUpdateSource
binding.standardUpdateSource=null;
}
}

最好还是创建自定义元素。

如果要添加“行为”,最好使用绑定行为。这将给你更多的控制,你甚至可以控制光标,等等

整数输入绑定行为.js

import {BindingSignaler} from 'aurelia-binding';

// grab a reference to the signaler
constructor(signaler: BindingSignaler) {
    this.path = [[0,0]];
    this.signaler = signaler;
}

// and fire the signal event bound in your view
// whenever the data behind the valueConverter changes
updatePath(position) {
    this.path.push(position);
    this.signaler.signal('update-view');
}
导出类IntegerInputBindingBehavior{
绑定(绑定,源){
binding.standardUpdateSource=binding.updateSource;
binding.updateSource=函数(值){
常量intValue=parseInt(值,10);
if(isNaN(intValue)){
此.standardUpdateSource(0);
返回;
}
此.standardUpdateSource(intValue);
if(intValue.toString(10)!==值){
this.updateTarget(intValue.toString(10));
}
};
}
解除绑定(绑定,源){
binding.updateSource=binding.standardUpdateSource
binding.standardUpdateSource=null;
}
}
最好还是创建一个自定义元素。

使用
信号
绑定行为
你会在你链接的问题中看到,我用类似的问题发表了评论。我实现的解决方案是使用
信号
绑定行为

template.html

<path d="${path| toSVGPath & signal: 'update-view'}" 
      style="stroke: black; stroke-width: 5; fill: none;"></path>
使用
信号
绑定行为
你会在你链接的问题中看到,我用类似的问题发表了评论。我实现的解决方案是使用
信号
绑定行为

template.html

<path d="${path| toSVGPath & signal: 'update-view'}" 
      style="stroke: black; stroke-width: 5; fill: none;"></path>

看起来已经有一个问题了:它已经解决了,但还有改进的余地,这就是为什么我为这个问题创建了一个问题:看起来已经有一个问题了:它已经解决了,但还有改进的余地,这就是为什么我为这个问题创建了一个问题:嗨,杰里米,谢谢你的回答。我看到绑定行为比值转换器强大得多。但我现在有点困惑,到底值转换器有什么好处?想象一下,必须将日期条目转换为js日期对象。好吧,这听起来像是一个完美的价值转换器,以及位,它将失败,因为同样的原因。。。所以,也许我应该问,ValueConverter有什么用?嗯,读了我的评论后,我觉得自己很愚蠢:)我知道他们基本上是按照自己的名字做的,但从vc内部强制更新视图的简单可能性非常好…就像xaml中的值转换器一样-无状态,无行为。最常用于显示格式。不用于创建控件,至少不用于创建控件本身。我看到了valueconverters的值;)在显示和格式化值时。但是fromView()允许修改ViewModel,并可能导致视图和ViewModel不同步。还有两种情况会发生这种情况:-vm以2位精度保存浮点,v允许输入2.456(超过2位精度)-一个允许您输入的日期输入:3.6,然后自动转换为2016年6月3日。用户可以选择只输入3,并且它也将被转换为相同的日期,因此视图仍然显示3,而不是2016年6月3日。在这种情况下,我认为这行
binding.standardSource=binding.standardsupdatesource应该是->
binding.updateSource=binding.standardUpdateSource