Data binding 聚合省道:数据绑定整数值到字符串属性
我正在尝试将整数绑定到字符串属性。确切地说,我正在尝试将已发布的整数变量绑定到文本输入元素的value属性 @公布的整数数据=0Data binding 聚合省道:数据绑定整数值到字符串属性,data-binding,binding,filter,dart,dart-polymer,Data Binding,Binding,Filter,Dart,Dart Polymer,我正在尝试将整数绑定到字符串属性。确切地说,我正在尝试将已发布的整数变量绑定到文本输入元素的value属性 @公布的整数数据=0 显然,字符串的引用存储在一个整数中 我尝试使用过滤器解决此问题,但仍然可以使其正常工作: int整型(对象a){ int-ret=0; if(a是字符串){ 试一试{ ret=int.parse(a); }关于格式化异常捕获(e){ } }else if(a为int){ ret=a; } 返回ret; } 所以我改为不使用绑定。有人能提出一个更好、更有效的解决方
显然,字符串的引用存储在一个整数中
我尝试使用过滤器解决此问题,但仍然可以使其正常工作:
int整型(对象a){
int-ret=0;
if(a是字符串){
试一试{
ret=int.parse(a);
}关于格式化异常捕获(e){
}
}else if(a为int){
ret=a;
}
返回ret;
}
所以我改为不使用绑定。有人能提出一个更好、更有效的解决方案吗?这是针对聚合物=1.0的见我的另一个答案 HTML属性只存储字符串值。您可以做的是在设置值时使用getter/setter进行绑定和解析
@可观察
int数据;
@ComputedProperty('data')//尚未尝试此操作,但应能正常工作-请参阅上的注释http://japhr.blogspot.co.at/2014/08/whats-difference-between-attribute-and.html
@可观察
获取数据值=>数据;
设置数据值(val){
if(val==null){
数据=0;
}else if(val是num){
数据=val.toInt();
}else if(val是字符串){
data=num.parse(val,(v)=>0.toInt();
}否则{
数据=0;
}
}
或者使用转换器或自定义聚合物表达式就像在书中解释的那样 替代方法 使用Dart聚合物1.0(也可以使用Dart聚合物0.16) 应用程序元素。省道
@HtmlImport('app\u element.html'))
库_template.web.app_元素;
导入'dart:html'作为dom;
导入“package:web\u components/web\u components.dart”显示HtmlImport;
进口“包装:聚合物/聚合物.dart”;
@聚合注册器('app-element')
类AppElement扩展了聚合关系{
AppElement.created():super.created();
@财产价值;
@属性字符串字符串值;
@可反射
valueInputHandler(dom.Event事件,[\u]){
var输入=(event.target作为dom.NumberInputElement);
var值=input.valueAsNumber;
如果(!value.isNaN&&!value.isInfinite){
set('intValue',value.toInt());
input.setCustomValidity(“”);
}否则{
//只是为了得到用于样式设置的`:invalid`伪类
setCustomValidity('不是数字');
}
}
}
app_element.html
输入:无效{
边框:3倍纯红;
}
stringValue:{{stringValue}}
intValue:{{intValue}}
对于聚合物1.0.0这对我来说效果很好
创建可重复使用的行为,或者只需将convertToNumeric()
添加到聚合物元素中:
@HtmlImport('app_element.html')
library app_element;
import 'dart:html' as dom;
import 'package:web_components/web_components.dart' show HtmlImport;
import 'package:polymer/polymer.dart';
@behavior
abstract class InputConverterBehavior implements PolymerBase {
@reflectable
void convertToInt(dom.Event e, _) {
final input = (e.target as dom.NumberInputElement);
double value = input.valueAsNumber;
int intValue =
value == value.isInfinite || value.isNaN ? null : value.toInt();
notifyPath(input.attributes['notify-path'], intValue);
}
}
@PolymerRegister('app-element')
class AppElement extends PolymerElement with InputConverterBehavior {
AppElement.created() : super.created();
@property int intValue;
}
将行为应用于元素:
@HtmlImport('app_element.html')
library app_element;
import 'dart:html' as dom;
import 'package:web_components/web_components.dart' show HtmlImport;
import 'package:polymer/polymer.dart';
@behavior
abstract class InputConverterBehavior implements PolymerBase {
@reflectable
void convertToInt(dom.Event e, _) {
final input = (e.target as dom.NumberInputElement);
double value = input.valueAsNumber;
int intValue =
value == value.isInfinite || value.isNaN ? null : value.toInt();
notifyPath(input.attributes['notify-path'], intValue);
}
}
@PolymerRegister('app-element')
class AppElement extends PolymerElement with InputConverterBehavior {
AppElement.created() : super.created();
@property int intValue;
}
在元素的HTML中配置输入元素:
- 将
绑定到属性:value
以便在属性更改时更新输入元素value=“[[intValue]]”
- 设置事件通知,以便在input=“convertToNumeric”notify path=“intValue”上的值更改时调用转换器,其中
是要用数值更新的属性的名称intValue
@behavior
abstract class InputConverterBehavior implements PolymerBase {
void convertToInt(value, String propertyPath) {
int result;
if (value == null) {
result = null;
} else if (value is String) {
double doubleValue = double.parse(value, (_) => double.NAN);
result =
doubleValue == doubleValue.isNaN ? null : doubleValue.toInt();
} else if (value is int) {
result = value;
} else if (value is double) {
result =
value == value.isInfinite || value.isNaN ? null : value.toInt();
}
set(propertyPath, result);
}
}
这样,您可以使用与文本输入字段相同的标记
<input type="number" value="{{intValue::input}}">
或者,如果要延迟属性的更新,直到输入字段离开
<input type="number" value="{{intValue::change}}">